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

Why isn't errorlevel being reset after this wget call?

这是我的代码:

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

好像设置了第一个错误级别,然后后续的 wget 无法覆盖它?

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

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

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

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

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

if errorlevel 1 (
    ....
)

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

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

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