Win batch:嵌套循环中的设置变量不起作用

时间:2012-06-12 20:44:18

标签: windows batch-file

解决:

我有一个很长的脚本,我已经浓缩到以下代码行来说明我遇到的问题。我已经尝试过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。如果问题是在循环迭代之后才设置变量,那么如何在我的其余代码中使用此变量?我想稍后使用这个变量,所以设置它是最重要的。感谢您的任何反馈。

解决方案: 我设置的变量没有显示当前值,因为我使用了延迟扩展,它让我感到困惑,没有看到值,所以它成了一个问题。由于我在循环中使用变量值,我需要访问变量的当前值!围绕变量名称,而不是%。

2 个答案:

答案 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
)