批处理脚本中的“如果存在”和“其他”功能出现问题

时间:2019-03-28 05:23:05

标签: batch-file if-statement exists

因此,我只想在子目录中包含S1文件以及.mkv / .ttf的情况下,才在子目录中运行该操作(用.otf表示)文件。这是我所做的事...

For /F Delims^=^ EOL^= %%A In ('Dir/B/AD 2^>Nul^|FindStr/IVXC:"Revised"'
) Do If Exist "%%A\*.mkv" ( 
If Exist "%%A\*.ttf" (
        If Not Exist "Revised\" MD "Revised" 2>Nul||Exit /B
        Call :S1 "%%A")
) else ( 
If Exist "%%A\*.otf" (
        If Not Exist "Revised\" MD "Revised" 2>Nul||Exit /B
        Call :S1 "%%A"))
GoTo :EOF

问题是S1操作仅在存在.otf文件而不是.ttf文件时发生。但是,如果我这样做...

For /F Delims^=^ EOL^= %%A In ('Dir/B/AD 2^>Nul^|FindStr/IVXC:"Revised"'
) Do If Exist "%%A\*.mkv" ( 
Do If Exist "%%A\*.ttf" (
        If Not Exist "Revised\" MD "Revised" 2>Nul||Exit /B
        Call :S1 "%%A")
) else ( 
If Exist "%%A\*.otf" (
        If Not Exist "Revised\" MD "Revised" 2>Nul||Exit /B
        Call :S1 "%%A"))
GoTo :EOF

通过在第3 rd 行中的Do之前添加If Exist,该脚本可以按预期运行,但我会不断收到此错误

  

'Do'不被识别为内部或外部命令

在没有提示的情况下让脚本按预期运行的问题,我能否获得帮助?

1 个答案:

答案 0 :(得分:1)

您为什么要在该位置添加doIf Exist "%%A\*.mkv" ( Do something )运行名为do的命令(如果该文件存在),但是由于该命令不存在,执行将失败,并显示以上消息

for循环中,单词do是语法的一部分,因此,在每个循环中要运行的命令之前,必须先拥有它。运行for /?以获得有关语法的帮助

此外,您的描述不清楚。您是否要呼叫S1

  • 存在(* .mkv和* .ttf)或(* .otf),或
  • 是否存在(* .mkv)和(* .ttf或* .otf)?

您的代码正在执行前者。很难看到,因为您的缩进非常糟糕。修复后就可以了

For /F Delims^=^ EOL^= %%A In ('Dir/B/AD 2^>Nul^|FindStr/IVXC:"Revised"') Do (
    If Exist "%%A\*.mkv" (
        If Exist "%%A\*.ttf" (
            If Not Exist "Revised\" MD "Revised" 2>Nul||Exit /B
            Call :S1 "%%A"
        )
    ) else ( 
        If Exist "%%A\*.otf" (
            If Not Exist "Revised\" MD "Revised" 2>Nul||Exit /B
            Call :S1 "%%A"
        )
    )
)

但是为什么在/V中使用2个矛盾的选项(/Xfindstr)?人们经常使用全部小写或全部大写的命令/关键字,而不是像这样的CamelCase。因此,要检查后一种情况,您可以使用此

for /f delims^=^ eol^= %%a in ('dir /b /ad 2^>nul ^| findstr /IVXC:"Revised"') do (
    if exist "%%a\*.mkv" (
        if exist "%%a\*.ttf" (
            if not exist "Revised\" md "Revised" 2>nul || exit /b
            Call :S1 "%%a"
        )
        if exist "%%a\*.otf" (
            if not exist "Revised\" md "Revised" 2>nul || exit /b
            call :S1 "%%a"
        )
    )
)