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

标签 batch-file batch-processing cpu-architecture

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

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

或者

  • 创建与以前相同,只是一旦完成,就会自动 将所有适当的文件复制到相应的文件夹中 结构。
  • 这个想法是,通过这个批处理文件,我可以将我的电影项目(因为我是一名与我兄弟一起工作的自由电影制作人)保存在我们所有 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...

    对历史上最肮脏的代码以及完全过度使用注释表示歉意。这本来是一个一晚的项目,结果变成了一个月的项目,我仍然没有解决它!

    即使是我的编程 friend 也无法解释为什么它不起作用。

    提前感谢所有帮助!!!

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

    剑侠

    最佳答案

    您的程序失败,因为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
    

    关于batch-file - 批量编码 - 选择命令不返回正确答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26261880/

    相关文章:

    R CMD BATCH-端子输出

    java - "subsequent read"在 volatile 变量的上下文中意味着什么?

    java - 是否可以在 Java 中检测处理器架构?

    caching - 为什么现代处理器中的集合缓存关联性是 8 路集合关联性?

    windows - 如何在 Windows 上使用 jpegtran 批量转换 JPEG 图像

    linux - Grep for String 在对应行打开

    batch-file - .bat 无意中删除子目录

    powershell - 检查列表以查看文件是否存在于 powershell 中?

    linux - Linux Shell 中的 `{} +` 在 Windows 中相当于什么?

    batch-file - "Counter"批量