不清楚你在输入什么。
如果执行命令test1 t1
然后:
value 将获取值 t1(从命令行尾部)
param 将获取值 t1
errorlevel 将设置为 0 作为 @ 987654328@成功了,所以
if %errorlevel%==0 goto:dif
将转到:dif,因为errorlevel (%errorlevel%) 的内容 是0 和0==0
这里有个小困难,因为如果errorlevel 不是 0,那么if 条件将not 执行goto dif(冒号最好省略),因此该过程将继续 - 在任何情况下都将标记为 :dif...
if %value%==!%param%! call test2.bat
将通过替换当前值来评估并执行
if t1==!t1! call test2.bat
因为value 和param 都包含t1。
但是t1 不等于!t1!,所以call 指令将被忽略。
如果你执行命令test1
value 将获取值 nothing(因为没有命令行尾部)
param 将获取值 t1
errorlevel 将被设置到0 因为set 成功了,所以
if %errorlevel%==0 goto:dif
将转到:dif,因为errorlevel (%errorlevel%) 的内容 是0 和0==0
if %value%==!%param%! call test2.bat
将通过替换当前值来评估并执行
if ==!t1! call test2.bat
因为value 包含nothing 而param 包含t1。
这是一个语法错误,因为 cmd 期望
if <i>string1</i>==<i>string2</i> ...
另一个问题是!something!的使用。
通常,! 只是另一个字符,例如 x 或 q 批量,%var% 表示 the content of the variable "var"。
当您有一个代码块(括号内的一系列命令)时,批处理首先将var 的值替换为%var%,然后执行命令,所以
set "var=original"
for %%a in (1 2 3) do (
rem this is a code block
echo before %var%
set "var=modified"
echo after %var%
)
echo then %var%
将报告original、original 3 次和modified,因为实际执行的是
set "var=original"
for %%a in (1 2 3) do (
rem this is a code block
echo before original
set "var=modified"
echo after original
)
echo then %var%
当特殊命令时这会改变
setlocal enabledelayedexpansion
被执行。 ! 则具有特殊含义。
set "var=original"
setlocal enabledelayedexpansion
for %%a in (1 2 3) do (
rem this is a code block
echo before %var% !var!
set "var=modified"
echo after %var% !var!
)
echo then %var% !var!
endlocal
echo final %var% !var!
在这种情况下,报告将是
原作之前
原版修改后
原始修改前
原版修改后
原始修改前
原版修改后
然后修改修改
最终原创!var!
因为%var% 指的是原始 值,而!var! 指的是修改 值(因此在第一个before,变量还没有被修改了,但是在after,变量已经被修改了,所以第二个和第三个循环将modified的值报告为!var!)
循环之后,%var% 和 !var! 都报告相同的内容(值在循环内被修改,但不是在循环结束后)。
最后,endlocal 将delayedexpansion 关闭,因此! 再次成为普通字符,endlocal 也会丢弃在执行setlocal 之后对变量所做的任何修改。因此显示了var 的原始值(就像执行setlocal 时一样)并且!var! 不再是一个特殊的字符串。
所以 - 你的
if %value%==!%param%! call test2.bat
会,如果setlocal enabledelayedexpansion 已被执行 并且param 包含t1 实际执行
if <i>the value contained in "value"</i>==<i>the value contained in "t1"</i> call test2.bat