以下应该打印false然后才为true 但它会打印出错误和错误 我调试了一下,好像当批处理在if时,调用woeks,但是没有设置res
为什么会这样?
@echo off
set res=true
Call :IsSame None None1
if false==false (
echo %res%
Call :IsSame None2 None2
echo %res%
)
GOTO :EOF
:IsSame
echo isSame
set res=false
if %~2==All (
set res=true
goto :EOF
)
if %~2==%~1 (
set res=true
goto :EOF
)
goto :EOF
答案 0 :(得分:1)
将第一行更改为echo on
,您将看到执行时%res%
被批处理文件立即替换为cmd.exe
字符串false
并且不再更改
解决方案正在使用setlocal enabledelayedexpansion
,例如在命令 set 的帮助中解释,可以通过在命令提示符窗口中输入set /?
@echo off
setlocal enabledelayedexpansion
set res=true
Call :IsSame None None1
if false==false (
echo old: %res%, new: !res!
Call :IsSame None2 None2
echo old: %res%, new: !res!
)
GOTO :EOF
:IsSame
echo isSame
set res=false
if %~2==All (
set res=true
goto :EOF
)
if %~2==%~1 (
set res=true
goto :EOF
)
goto :EOF
第二行现在启用了环境变量的延迟扩展。
此外,!res!
还有两次%res%
来证明延迟扩展和非延迟扩展之间的区别。感谢Stephan提出此建议。
答案 1 :(得分:0)
您的代码中存在一些小错误。
@ECHO OFF
SET res=false
CALL :IsSame None None
IF false==false (
ECHO %res%
CALL :IsSame None2 None
ECHO %res%
)
GOTO EOF
:IsSame
ECHO isSame
SET res = false;
if %~2==All (
ECHO number1
SET res=true
GOTO:EOF
)
if %~2==%~1 (
SET res=true
ECHO %res%
GOTO:EOF
)
GOTO:EOF
:EOF