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

问题描述 投票:1回答:1

所以我想在子目录中运行操作(由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行的Do之前添加If Exist,脚本按预期运行但我会不断收到此错误

'Do'不被视为内部或外部命令

我是否可以在没有提示的情况下获得有关使脚本按预期运行的问题的帮助?

batch-file if-statement exists
1个回答
1
投票

为什么在那个地方添加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"
        )
    )
)

但是你为什么在/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"
        )
    )
)
© www.soinside.com 2019 - 2024. All rights reserved.