为什么在这个 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)
这是我的代码:
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)