【问题标题】:Batch file compare returning 0 when files are different当文件不同时,批处理文件比较返回 0
【发布时间】:2012-04-13 13:33:23
【问题描述】:

我在 Windows 2003 服务器上使用调度系统,该系统需要批处理文件来运行不同的作业。我有一项工作是检查文件是否存在,比较文件是否为空,然后根据结果执行某些操作。每次我运行它,返回的错误级别都是 0,但是文件不同。我希望看到返回 1。

我已经验证了文件的位置,一个文件有内容,另一个是空的。我已经设置了提示,他们都说 %ERRORLEVEL% 是 0。我什至将文件移动到批处理作业的同一目录中,但它们仍然显示 0。

代码:

echo %ERRORLEVEL%
IF EXIST data.DON ( 
echo before %ERRORLEVEL%
    FC data.DON ZERO.SEQ
echo after %ERRORLEVEL%
    IF %ERRORLEVEL% EQU 1 GOTO :PROCESS
)

输出:

16:37:08.12 Thu 03/29/2012
>IF EXIST data.DON (
echo before 0  
 FC data.DON ZERO.SEQ  
 echo after 0  
 IF 0 EQU 1 GOTO :PROCESS 
) 
before 0
Comparing files data.DON and ZERO.SEQ
***** data.DON
Name|Date|Location    

***** ZERO.SEQ
*****

after 0

我在同一台服务器上的其他作业中有这个确切的代码,指向不同的数据文件,它可以工作。有什么我可以尝试的想法吗?

【问题讨论】:

    标签: batch-file file-comparison


    【解决方案1】:

    如果替换任何 %variable% 的值括号内,该值与变量输入括号之前的值相同:

    set var=Old value
    ( set var=New value & echo %var% )
    

    以前的代码总是显示:旧值

    要解决这个问题,你必须使用延迟扩展,即用感叹号而不是百分比将变量括起来,并在开头添加SETLOCAL命令:

    setlocal EnableDelayedExpansion
    set var=Old value
    ( set var=New value & echo !var! )
    

    所有前面的描述也适用于 errorlevel 变量,因此将代码中的所有 %errorlevel% 替换为 !errorlevel! 并插入前面的 SETLOCAL ...

    【讨论】:

    • 谢谢。我最终将检查移到 if 循环之外,这对我有用。
    • 当然!如果你在括号外使用 %errorlevel% 这个问题就会消失。但要小心!如果将多个命令在同一行与 & 结合使用,问题仍然存在:如果删除括号,我上面的第一个示例仍然显示“旧值”!
    【解决方案2】:

    检查errorlevel的正确方法是这样的:

    IF EXIST data.DON ( 
        FC data.DON ZERO.SEQ
        IF ERRORLEVEL 1 GOTO :PROCESS
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多