解决:
我有一个很长的脚本,我已经浓缩到以下代码行来说明我遇到的问题。我已经尝试过StackOverflow用户的一些建议无济于事,所以希望您的反馈能够帮助我和未来的用户。注意:此代码有效,但设置pdfREP嵌套变量除外。
SETLOCAL enabledelayedexpansion set pdfREP=false for /f "tokens=1" %%a in ('dir /o /b \\path2document\*.rp?') do ( findstr "," \\path2log\%%a > 1.log if not errorlevel 0 ( :: do something ) if errorlevel 0 ( findstr /B /I "p" \\path2document\%%a > 1.log if errorlevel == 0 ( set pdfREP=true echo RSP File: %%a >> 2.log ) ) echo the value of pdfREP is !pdfREP! )
基本上问题是在\ path2document中我有多个文件,并在每个文件中我查找逗号。如果没有找到逗号,那么我想知道文件的文本中是否有特定的字母。如果找到文本,我将先前定义的变量设置为TRUE,而不是FALSE。但是,如果语法不同(%errorlevel%== 0,%errorlevel%EQU 0),则“if errorlevel == 0”可以为true,并且不会将变量pdfREP设置为TRUE。如果问题是在循环迭代之后才设置变量,那么如何在我的其余代码中使用此变量?我想稍后使用这个变量,所以设置它是最重要的。感谢您的任何反馈。
解决方案: 我设置的变量没有显示当前值,因为我使用了延迟扩展,它让我感到困惑,没有看到值,所以它成了一个问题。由于我在循环中使用变量值,我需要访问变量的当前值!围绕变量名称,而不是%。
答案 0 :(得分:2)
Windows批处理具有处理嵌套变量的“有趣”方式。 This article可能有帮助。
就个人而言,当我的批处理文件变得复杂时,我会切换到另一种语言。我的第一选择通常是Python,但是如果你想留在微软生态系统中,那么vbscript或PowerShell就可以了。
答案 1 :(得分:2)
您滥用IF命令和错误级别值。
IF命令描述表明您可以直接在条件中使用ERRORLEVEL字,后跟一个表示给定errorlevel的数字。这样,以下两个IF命令是正确的:
if not errorlevel 0 (
:: do something
)
if errorlevel 0 (
但是,以下命令写得不好:
if errorlevel == 0 (
在这种情况下,你必须使用!errorlevel!指示在执行最后一行后获取当前的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
)