为什么在这个wget调用之后没有重置错误级别?

时间:2015-03-27 16:47:19

标签: windows cmd wget

这是我的代码:

wget url
if %errorlevel% gtr 0 (
    powershell.exe restart-service wampapache
    SET errorlevel= 0
    PING -n 41 127.0.0.1>nul
    wget url
    if %errorlevel% gtr 0 (
        THIS PART COMES UP EVEN THOUGH THE wget can access the url and apache is up
    )
)

似乎第一个errorlevel被设置,然后后续的wget不能覆盖它?

1 个答案:

答案 0 :(得分:2)

在批处理文件中,解析,执行每行或每行(括号内的代码),并为下一行/块重复该过程。在解析阶段,将删除所有变量读取,并在代码开始执行之前使用变量中的值替换。如果变量在行/块内更改其值,则无法从同一行/块内检索此更改的值,因为变量读取操作不存在。

解决问题的通常方法是使用延迟扩展。启用后,您可以将语法从%var%更改(如果需要)到!var!,向解析器指示必须延迟读取操作,直到使用该值的命令开始执行。

setlocal enabledelayedexpansion
if %errorlevel% gtr 0 (
     ....
     wget url
     if !errorlevel! gtr 0 (
     )
    ....
)

在第一种情况下,可以使用正常扩展,因为在解析块之前变量的值已经改变。在第二种情况下,变量在块内变化并检索此更改值,使用延迟扩展。

当变量为%errorlevel%时,您可以更改语法并使用通常的if errorlevel语法检查结果。

if errorlevel 1 (
    ....
)

对于任何等于或大于指示值的错误级别值,它将评估为true。

另一种选择是使用条件执行运算符&&(如果上一个命令没有引发错误级别,则执行以下代码)和||(如果上一个命令引发了错误级别,则执行以下代码)

wget url || echo failed
wget url && echo it works
wget url && (echo it works) || (echo failed)