win批处理:在嵌套循环中设置变量不起作用



我有一个很长的脚本,我已将其浓缩为以下代码行来说明我遇到的问题。我已经尝试了StackOverflow用户的一些建议,但无济于事,所以希望您的反馈对我和未来的用户有所帮助。注意:此代码有效,除了设置 pdfREP 嵌套变量。

设置本地启用延迟扩展设置 pdfREP=false对于/f "tokens=1" %%a in ('dir/o/b \\path2document\*.rp?') do (    findstr ","\\path2log\%%a> 1.log    如果不是错误级别 0 (        ::做点什么        )    如果错误级别为 0 (        findstr/B/I "p" \\path2document\%%a> 1.log        如果错误级别 == 0 (            设置 pdfREP=true            回显 RSP 文件: %%a>> 2.log        )    )  )

基本上问题是在 \path2document 中我有多个文件,在每个文件中我都寻找一个逗号。如果未找到逗号,那么我想知道文件文本中是否有特定的字母。如果找到文本,则 I 将先前定义的变量设置为 TRUE,而不是 FALSE。但是,如果语法不同(%errorlevel%==0,%errorlevel% EQU 0),则"if errorlevel == 0"可以为真,并且它不会将变量pdfREP设置为TRUE。如果问题是变量直到循环迭代之后才设置,那么如何在其余代码中使用此变量?我想稍后使用此变量,因此设置它是最重要的。感谢您的任何反馈。

Windows 批处理具有处理嵌套变量的"有趣"方式。 本文可能会有所帮助。

就个人而言,当我的批处理文件变得如此复杂时,我会切换到另一种语言。 我的第一选择通常是Python,但如果你想留在Microsoft生态系统中,那么vbscript或PowerShell就可以了。

您误用了 IF 命令和错误级别值。

IF 命令说明指示您可以在条件中直接使用 ERRORLEVEL 单词,后跟一个数字来指示给定的错误级别。这样,以下两个 IF 命令是正确的:

if not errorlevel 0 (
    :: do something
    )
if errorlevel 0 (

但是,以下命令写得不好:

if errorlevel == 0 (

在这种情况下,您必须使用 !errorlevel! 来指示在执行最后一行后采用当前的错误级别值:

if !errorlevel! == 0 (

独立于上述内容,这就是我会这样做的方式:

if not errorlevel 0 (
    echo The errorlevel is less than zero 
) else if errorlevel 0 (
    echo The errorlevel is greater than zero
) else (
    echo The errorlevel is zero
)

最新更新