这是我的代码:
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不能覆盖它?
答案 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)