Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理编码-选择不返回正确答案的命令_Batch File_Batch Processing_Cpu Architecture - Fatal编程技术网

Batch file 批处理编码-选择不返回正确答案的命令

Batch file 批处理编码-选择不返回正确答案的命令,batch-file,batch-processing,cpu-architecture,Batch File,Batch Processing,Cpu Architecture,我正在尝试创建一个具有两个选项的批处理文件: 创建一系列具有自定义名称的文件夹(由用户输入的变量定义) 或 创建与以前相同的内容,但完成后会自动创建 将所有适当的文件复制到 结构 我的想法是,通过这个批处理文件,我可以将我的电影项目(因为我是一个与我兄弟一起工作的自由电影制作人)保存在我们所有3台计算机上完全相同的文件夹结构中。也就是说,一个统一的项目文件夹结构可以通过简单的双击和几个要填写的变量来实现,而在选项2的情况下,在指定SD卡上找到的任何文件也会移动到结构中的适当文件夹中 实际的xco

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

  • 创建一系列具有自定义名称的文件夹(由用户输入的变量定义)
  • 创建与以前相同的内容,但完成后会自动创建 将所有适当的文件复制到 结构
  • 我的想法是,通过这个批处理文件,我可以将我的电影项目(因为我是一个与我兄弟一起工作的自由电影制作人)保存在我们所有3台计算机上完全相同的文件夹结构中。也就是说,一个统一的项目文件夹结构可以通过简单的双击和几个要填写的变量来实现,而在选项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
    
    证明这个问题是个问题的证据 我在两台单独的机器上测试了批处理文件(一台通过远程访问,以便两个屏幕并排放置),可以在这里查看:

    为历史上最肮脏的代码和评论的过度使用道歉。这应该是一个一夜的项目,已经变成了一个月的项目,我还没有解决它

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

    谢谢大家的帮助

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

    周日晚上

    如本文所述:

    顺便说一句,在WindowsNT4中,这不起作用,因为SET命令本身将设置一个errorlevel(通常为0)! 但是,Windows NT通过将最新的errorlevel存储在环境变量errorlevel中使其变得简单

    这对我很有用:

    @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
    
    除非你知道请求微软神宽恕的正确仪式,否则我建议你远离batch,这会带来很多麻烦


    即使是PowerShell也没有那么麻烦。

    您的程序失败,因为
    IF ERRORLEVEL n…
    “如果ERRORLEVEL大于或等于给定的数字,则执行命令”,也就是说,您将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
    

    真管用!谢谢我能问一下还有什么其他的方法可以批量生产吗?批处理只是我学习的一种语言,所以如果有更好的语言用于此类操作(以及任何更高级的操作),我肯定是开放的。非常感谢。很显然,我错了,为什么你的脚本不起作用(见Aacini的答案)。然而,我不收回我对批次不好的评论。如果我只能推荐一种语言,那就是Python,因为它有一个交互式解释器(所以你可以一次一行地尝试一些东西,例如,很棒的学习工具),但实际上任何脚本语言都可以工作。甚至VisualBasic或PowerShell(尽管我不是一个超级粉丝)都是不错的工具。在学习choice命令时,我一直在强调不要以错误的顺序设置错误级别。他们必须从最后一个选择到第一个选择,因为某种原因我记不得了。谢谢你的建议,我会再次深入研究Python,我试过一次,但没有真正的专注和决心。。。