2012-06-12 111 views
0

议决内设置变量:赢批:嵌套循环不工作

我有,我都凝结于以下几行代码来说明我有这个问题很长的脚本。我已经尝试了一些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”可以为真,并且它不会将变量pdfREP设置为TRUE。如果问题是该变量在循环迭代之前没有设置,那么我如何在代码的其余部分使用这个变量?我想稍后使用这个变量,所以设置它是最重要的。感谢您的任何反馈。

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

回答

2

Windows批处理具有处理嵌套变量的“有趣”方式。 This article可能会有所帮助。

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

+0

感谢您的链接。 – thehme

2

您正在滥用IF命令和错误级别值。

如果命令描述表明您可以直接在条件中使用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 
) 
+0

嗨Acini,这段代码实际上工作。正如我所提到的,它可以执行%errorlevel%== 0,%errorlevel%EQU 0或errorlevel 0.但这不是我的问题。问题是设置嵌套变量。用户jdigital给了我一个链接,我看了一下,但是它的措辞很糟糕,而且它说的很多,我试过了,所以没有多大帮助。 – thehme

+0

@Bc。当以前的'findstr ...'返回0时,要设置pdfREP = true',只需使用'if!errorlevel! == 0('正如我之前所说的... – Aacini