Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 批处理功能集不工作,为什么?_Batch File - Fatal编程技术网

Batch file 批处理功能集不工作,为什么?

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

以下内容应打印为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

将第一行更改为
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命令中的一个错误