批量编码 - 选择不返回正确答案的命令

时间:2014-10-08 16:30:37

标签: batch-file batch-processing cpu-architecture

我正在尝试创建一个包含两个选项的批处理文件:

  1. 使用自定义名称(由用户输入的变量定义)创建一系列文件夹
  2. OR

    1. 创建与之前相同的内容,但也会在完成后自动创建 将所有适当的文件复制到相应的文件夹中 结构
    2. 我的想法是,通过这个批处理文件,我可以保存我的电影项目(因为我是一名自由职业电影制片人,与我的兄弟一起工作),在我们所有3台计算机上完全相同的文件夹结构。 AKA统一的项目文件夹结构可以通过简单的双击和几个变量来实现,而在选项2的情况下,在指定的SD卡上找到的任何文件也会移动到结构中的相应文件夹中。

      实际的xcopy命令和mkdir命令等完全符合它们的预期。

      由于不同的计算机将根据已经连接到计算机的内容分配不同的驱动器号,然后将SD卡输入读卡器,我将永远不知道SD卡的驱动器号将是什么(从镜头和图像将被加载到计算机上。)

      例如: 一台计算机在插入SD卡时可能有一个外置硬盘(其中有几个),而另一台可能只有SD卡作为外部设备。

      下面的代码是完整的.bat文件,其中包含我曾尝试过的代码但由于某些原因无法使用或需要排除的代码。我在评论中有一些代码行,所以我知道我过去尝试过的东西,这些显然不再用了。

      :Menu
      ECHO OFF
      CLS
      ECHO OFF
      TITLE Saborknight Productions - Project Creator
      ECHO.
      ECHO ...............................................
      ECHO PRESS the appropriate number to select your task, or 3 to EXIT.
      ECHO ...............................................
      ECHO.
      ECHO 1 - Create Saborknight Default folder Hierarchy within a project folder
      ::(Disabled)ECHO 2 - Create Saborknight Default folder Hierarchy AND copy ALL files from SD Card to the appropriate folder
      ECHO 3 - EXIT
      ECHO.
      ECHO WARNING - Option 2 will delete the files from the Recording Device automatically. Secure the device before proceeding!
      ECHO.
      ECHO.
      CHOICE /c 123 /n 
      IF ERRORLEVEL 3 EXIT
      IF ERRORLEVEL 2 GOTO :CREATE
      IF ERRORLEVEL 1 GOTO :CREATE
      ::End of Menu
      
      ---------------------------------------------------------------------------------------------
      
      :CREATE
      ::Creates DIR Folder Structure as per Saborknight Productions Standard
      ECHO OFF
      CLS
      
      ::Variables Descriptor
      SET /P project_name=Enter the Project Name: || SET project_name=NothingChosen
      If "%project_name%"=="NothingChosen" (
          GOTO ERROR_PROJECT
          ) ELSE (
          GOTO CREATOR
          )
      
      :ERROR_PROJECT
      ::If no Project Name is entered
      ECHO Please enter the Project Name
      GOTO CREATE
      
      :CREATOR
      ::DIR Creator + Confirmation
      ::Videos DIR
      ECHO OFF
      MKDIR D:\"Movie Projects"\"%project_name%"\Footage
      ::Cut from above MKDIR -> \"Day 1"\%device_name%
      ::Images DIR
      ECHO OFF
      MKDIR D:\"Movie Projects"\"%project_name%"\Images\%device_name%
      ::Audio DIR -> Soundtracks
      ECHO OFF
      MKDIR D:\"Movie Projects"\"%project_name%"\Audio\Soundtracks
      ::Audio DIR -> Recordings
      ECHO OFF
      MKDIR D:\"Movie Projects"\"%project_name%"\Audio\Recordings
      ::Audio DIR -> Sound FX
      ECHO OFF
      MKDIR D:\"Movie Projects"\"%project_name%"\Audio\"Sound FX"
      ::Premier Project DIR
      ECHO OFF
      MKDIR D:\Dropbox\"Project Files"\"%project_name%"
      
      ECHO The Folder Structure has been created
      ECHO.
      ECHO.
      ECHO What would you like to do next?
      Echo.
      ECHO 1 - View Created Folder Structure
      ECHO 2 - Go to Menu
      ECHO 3 - EXIT
      ::Choice is invisible
      CHOICE /c 123 /n
      IF ERRORLEVEL 3 EXIT
      IF ERRORLEVEL 2 GOTO MENU
      IF ERRORLEVEL 1 GOTO VIEW
      ::End of CREATE
      
      ---------------------------------------------------------------------------------------------
      
      :COPY
      ::Creates DIR Folder Structure as per Saborknight Productions Standard + Copying/Moving Files from a selected SD Card connected to the computer
      ECHO OFF
      CLS
      
      :COPY_PROJECT
      ::Project Variable Descriptor
      SET /P project_name=Enter the Project Name: || SET project_name=NothingChosen
      If "%project_name%"=="NothingChosen" (
          GOTO ERROR_COPY_PROJECT
          ) ELSE (
          GOTO COPY_DEVICE_NAME
          )
      ::If True, Process continues
      
      :COPY_DEVICE_NAME
      ::Device Name Variable Descriptor
      ECHO.
      SET /P device_name=Enter the Name of the Recording Device: || SET device_name=NothingChosen
      If "%device_name%"=="NothingChosen" (GOTO DAMN_DEVICE) ELSE (GOTO DEVICE_DIR)
      
      :DEVICE_DIR
      ::Device DIR Variable Descriptor
      ECHO.
      ::Selecting the location of the SD Card of the Recording Device + Confirmation
      ECHO Copy files from drive: E, F, G, H or I?
      SET _drive=G
      ::SETLOCAL EnableDelayedExpansion
      ::CHOICE /c fgehi
      ::IF ERRORLEVEL 5 SET _drive=I
      ::IF ERRORLEVEL 4 SET _drive=H
      ::IF ERRORLEVEL 3 SET _drive=G
      ::IF ERRORLEVEL 2 SET _drive=F
      ::IF ERRORLEVEL 1 SET _drive=E
      ECHO.
      ECHO You have selected drive %_drive%:
      ECHO.
      
      ::DIR Creator + Confirmation -> Only if Device Drive is successfully selected
      ::Videos DIR
      ECHO OFF
      MKDIR D:\"Movie Projects"\"%project_name%"\Footage\"Day 1"\"%device_name%"
      ::Images DIR
      ECHO OFF
      MKDIR D:\"Movie Projects"\"%project_name%"\Images\"%device_name%"
      ::Audio DIR -> Soundtracks
      ECHO OFF
      MKDIR D:\"Movie Projects"\"%project_name%"\Audio\Soundtracks
      ::Audio DIR -> Recordings
      ECHO OFF
      MKDIR D:\"Movie Projects"\"%project_name%"\Audio\Recordings
      ::Audio DIR -> Sound FX
      ECHO OFF
      MKDIR D:\"Movie Projects"\"%project_name%"\Audio\"Sound FX"
      ::Premier Project DIR
      ::ECHO OFF
      ::(Disabled for Testing)MKDIR D:\Dropbox\"Project Files"\"%project_name%"
      
      ECHO.
      CHOICE /c YN /m "Would you like files to be deleted automatically from the device? Press Y=Yes or N=No"
      IF ERRORLEVEL 2 GOTO NO_DELETE
      IF ERRORLEVEL 1 GOTO DELETE
      
      :NO_DELETE
      ::No Deletion once Copied from Device
      ::For Copying Videos
      ECHO.
      ECHO Copying Videos
      XCOPY %_drive%:\DCIM\ "D:\Movie Projects\"%project_name%"\Footage\"Day 1"\"%device_name%"\" *.MOV *.mp4 /V /-Y
      ::COPY %_drive%:\DCIM\ "D:\Movie Projects\"%project_name%"\Footage\"Day 1"\"%device_name%"\" *.MOV *.mp4  
      ::ROBOCOPY %_drive%:\DCIM "D:\"Movie Projects"\"%project_name%"\Footage\"Day 1"\"%device_name%"\*" *.mov *.mp4 /mir /copy:DATO /np /eta /log+:"Log - Footage CopyOnly.txt" /nosd /nodd
      PAUSE
      ::For Copying Images
      ECHO.
      ECHO Copying Images
      XCOPY %_drive%:\DCIM\ "D:\Movie Projects\"%project_name%"\Images\"%device_name%"\" *.MOV *.mp4 /V /-Y
      ::COPY %_drive%:\DCIM\*.jpg;*.png;*.cr2 "D:\Movie Projects\"%project_name%"\Images\"%device_name%"\" /V /-Y
      ::ROBOCOPY %_drive%:\DCIM "D:\"Movie Projects"\"%project_name%"\Footage\"Day 1"\"%device_name%"" *.jpg *.png *.cr2 /copy:DATO /mir /np /eta /log+:"Log - Images Copy Only.txt" /nosd /nodd
      PAUSE
      GOTO SUCCESS_MSG
      
      :DELETE
      ::Copying with Automatic Deletion once Copied
      ::For Copying and Deleting Videos
      ECHO Copying and Deleting Videos
      MOVE %_drive%:\DCIM\*.mov;*.mp4 D:\"Movie Projects"\"%project_name%"\Footage\"Day 1"\"%device_name%"\ /-Y
      ::ROBOCOPY %_drive%:\DCIM D:\"Movie Projects"\"%project_name%"\Footage\"Day 1"\"%device_name%" *.mov *.mp4 /mov /copy:DATO /np /eta /log+:"Log - Footage Copy Delete.txt" /nosd /nodd
      PAUSE
      ::For Copying and Deleting Images
      ECHO Copying and Deleting Images
      MOVE %_drive%:\DCIM\*.jpg;*.png;*.cr2 D:\"Movie Projects"\"%project_name%"\Images\"%device_name%"\ /-Y
      ::ROBOCOPY %_drive%:\DCIM D:\"Movie Projects"\"%project_name%"\Images\"%device_name%" *.jpg *.png *.cr2 /mov /copy:DATO /np /eta /log+:"Log - Images Copy Delete.txt" /nosd /nodd
      PAUSE
      GOTO SUCCESS_MSG
      
      :SUCCESS_MSG
      ::Only if all Copying/Moving and DIR Creation Processes are Completed Successfully
      ECHO.
      ECHO The Folder Structure has been created and files copied/moved
      ECHO.
      ECHO.
      ECHO What would you like to do next?
      Echo.
      ECHO 1 - View Created Folder Structure
      ECHO 2 - Go to Menu
      ECHO 3 - EXIT
      ::Choice is invisible
      CHOICE /c 123 /n
      IF ERRORLEVEL 3 EXIT
      IF ERRORLEVEL 2 GOTO MENU
      IF ERRORLEVEL 1 GOTO :VIEW
      
      :DAMN_DEVICE
      ECHO.
      ECHO Please enter the Device Name, Re-entering the Project Name
      ECHO.
      GOTO COPY
      
      :ERROR_COPY_PROJECT
      ::If no Project Name is entered
      ECHO.
      ECHO Please enter the Project Name
      ECHO.
      GOTO COPY_PROJECT
      ENDLOCAL
      ::End Of COPY
      
      ---------------------------------------------------------------------------------------------
      
      :VIEW
      ECHO OFF
      CLS
      
      TREE D:\"Movie Projects"\"%project_name%"
      ECHo.
      ECHO Press any key to return to Menu
      ECHO.
      PAUSE
      GOTO MENU
      ::End of VIEW
      

      问题

      在这部分代码中,CHOOSE命令不会选择正确的选择:

      @ECHO OFF
      CHOICE /c fgehi
      
      IF ERRORLEVEL 5 SET _drive=I
      IF ERRORLEVEL 4 SET _drive=H
      IF ERRORLEVEL 3 SET _drive=E
      IF ERRORLEVEL 2 SET _drive=G
      IF ERRORLEVEL 1 SET _drive=F
      Pause
      ECHO.
      ECHO You have selected drive %_drive%:
      ECHO.
      Pause
      

      问题的证据

      我在两台独立的机器上测试批处理文件(一台通过远程访问,以便两个屏幕并排放置),可在此处查看:Image of the Problem being a problem...

      为历史上最脏的代码道歉,完全过度使用评论。这应该是一个一个晚上的项目,已经变成了一个月的项目,我仍然没有解决它!

      即便是我的编程朋友也无法解释为什么它不会起作用。

      所有的帮助都提前赞赏!!!

      此外,任何完成上述任务的替代建议都是值得欢迎的,我喜欢学习新代码!

      Saborknight

2 个答案:

答案 0 :(得分:2)

您的程序失败,因为IF ERRORLEVEL n ..."如果错误级别比给定的数字大得多或等于,则执行命令,即,您以相反的顺序放置IF命令。这可以正常工作:

@ECHO OFF
CHOICE /c fgehi

IF ERRORLEVEL 1 SET _drive=F
IF ERRORLEVEL 2 SET _drive=G
IF ERRORLEVEL 3 SET _drive=E
IF ERRORLEVEL 4 SET _drive=H
IF ERRORLEVEL 5 SET _drive=I
Pause
ECHO.
ECHO You have selected drive %_drive%:
ECHO.
Pause

我可以建议你使用另一种更简单的方法吗?

@ECHO OFF
SET option=0FGEHI
CHOICE /c fgehi

CALL SET _drive=%%option:~%ERRORLEVEL%,1%%
ECHO.
ECHO You have selected drive %_drive%:
ECHO.
Pause

答案 1 :(得分:1)

如此处所述:http://www.robvanderwoude.com/choice.php

  

顺便说一句,在Windows NT 4中,这不会起作用,因为SET命令本身会设置一个错误级别(通常为0)!   但是,通过将最新的errorlevel存储在环境变量ERRORLEVEL

中,Windows NT可以轻松实现

这对我有用:

@ECHO OFF
CHOICE /c fgehi

IF %ERRORLEVEL% EQU 5 SET _drive=I
IF %ERRORLEVEL% EQU 4 SET _drive=H
IF %ERRORLEVEL% EQU 3 SET _drive=E
IF %ERRORLEVEL% EQU 2 SET _drive=G
IF %ERRORLEVEL% EQU 1 SET _drive=F
Pause
ECHO.
ECHO You have selected drive %_drive%:
ECHO.
Pause

除非你知道要求微软众神宽恕的正确仪式,否则我建议你远离批处理,这很麻烦。

即使PowerShell也不那么麻烦。