小编Bro*_*own的帖子

在 IF 内部时未设置批处理文件中的变量?

我有两个非常简单的批处理文件示例:

给变量赋值:

@echo off
set FOO=1
echo FOO: %FOO%
pause
echo on
Run Code Online (Sandbox Code Playgroud)

正如预期的那样,结果是:

FOO: 1 
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

但是,如果我将相同的两行放在 IF NOT DEFINED 块中:

@echo off
IF NOT DEFINED BAR (
    set FOO=1
    echo FOO: %FOO%
)
pause
echo on
Run Code Online (Sandbox Code Playgroud)

出乎意料地导致:

FOO: 
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

应该与 IF没有任何关系,显然该块正在被执行。如果我在 if 上方定义 BAR,则只显示 PAUSE 命令中的文本,正如预期的那样。

是什么赋予了?


跟进问题:有没有办法在没有 setlocal 的情况下启用延迟扩展?

如果我从另一个内部调用这个简单的示例批处理文件,则该示例设置 FOO,但仅限于 LOCALLY。

例如:

测试调用者.bat

@call test.bat 
@echo FOO: …
Run Code Online (Sandbox Code Playgroud)

windows batch command-line

82
推荐指数
2
解决办法
14万
查看次数

从子程序退出批处理文件

如何从子程序内部退出批处理文件?

如果我使用 EXIT 命令,我只需返回到我调用子例程的行,然后继续执行。

下面是一个例子:

@echo off
ECHO Quitting...
CALL :QUIT
ECHO Still here!
GOTO END

:QUIT
EXIT /B 1

:END
EXIT /B 0
Run Code Online (Sandbox Code Playgroud)

输出:

Quitting...
Still here!
Run Code Online (Sandbox Code Playgroud)

更新:

这不是一个正确的答案,但我最终做了一些事情:

@echo off
CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
ECHO You shouldn't see this!
GOTO END

:SUBROUTINE_WITH_ERROR
ECHO Simulating failure...
EXIT /B 1

:HANDLE_FAIL
ECHO FAILURE!
EXIT /B 1

:END
ECHO NORMAL EXIT!
EXIT /B 0
Run Code Online (Sandbox Code Playgroud)

双管语句:

CALL :SUBROUTINE_WITH_ERROR || GOTO HANDLE_FAIL
Run Code Online (Sandbox Code Playgroud)

是简写:

CALL :SUBROUTINE_WITH_ERROR 
IF ERRORLEVEL 1 GOTO HANDLE_FAIL    
Run Code Online (Sandbox Code Playgroud)

我仍然很想知道是否有一种方法可以直接从子例程中退出,而不必让 CALLER …

batch

22
推荐指数
2
解决办法
3万
查看次数

标签 统计

batch ×2

command-line ×1

windows ×1