Batch file 批处理功能集不工作,为什么?
以下内容应打印为false,然后打印为true 但是相反,它打印的是假和假 我对它进行了一点调试,似乎当批处理在if中时,调用woeks,但不设置res 为什么呢Batch file 批处理功能集不工作,为什么?,batch-file,Batch File,以下内容应打印为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=f
@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
将第一行更改为
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%
以演示延迟扩展和未延迟扩展之间的差异。谢谢您的建议。您的代码中有几个小错误
@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
更好的是:调用后的回显可以是:回显旧的:%res%,新的:!瑞斯
以显示这两个值。请参阅Microsoft关于和的文章,了解无标签的EOF
是正确的。除了goto:EOF
之外,命令goto
和标签名称之间应该始终有一个不带冒号的空格,尽管cmd.exe
也解释goto:label
正确。语法上100%正确不过是goto-label
@Mofi,也许我太习惯于老式的DOS批处理代码:)我一直使用goto:EOF作为子例程,因为它看起来比goto:EOF“干净”,而goto:EOF看起来只是普通goto命令中的一个错误