批处理脚本中 'If exist' 和 'else' 函数的问题

Issue with the 'If exist' and 'else' function in batch script

所以我想在子目录中运行操作(用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

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

'Do' is not recognized as a internal or external command

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

为什么要在那个地方加上do?如果文件存在,If 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"
        )
    )
)

但为什么在findstr中使用2个相互矛盾的选项(/V/X)?人们经常对 commands/keywords 使用全小写或全大写,而不是那样的 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"
        )
    )
)