批处理功能设置不起作用,为什么?

时间:2014-07-07 08:46:07

标签: 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=false
if %~2==All (
    set res=true
    goto :EOF
)
if %~2==%~1 (
    set res=true
    goto :EOF
)
goto :EOF

2 个答案:

答案 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