批处理脚本中 '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"
)
)
)
所以我想在子目录中运行操作(用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"
)
)
)