Windows批量括号范围

我怎样才能设置结果variables在一个范围内包围('if'或'for'循环)。 结果是正确的(>> RESULT:aaa = bbb),当直接调用过程时,在for循环或if语句(>> RESULT:ccc =)中使用时失败。

:: ===================================== @setlocal @echo off @rem (1) call :testReturn aaa echo RESULT: aaa = %aaa% @rem (2) if "1" == "1" ( call :testReturn ccc echo RESULT: ccc = %ccc% ) goto :eof :testReturn set %~1=bbb exit /b endlocal 

谢谢!!

当括号内的复合语句被执行时,首先将语句从左括号分解到匹配的右括号。

在这个时候,任何%var%被替换为该环境在该环境中的值(即它的PARSE-TIME值)。

那么,如果这个陈述看起来有效,它就会被执行。

有三种常见的方法来访问变量的RUN-TIME值(例如,执行FOR循环)。

1 / SETLOCAL ENABLEDELAYEDEXPANSION切换到模式!var! 可用于访问var的运行时值
2 / CALL set var2=%%var%%根据var的运行时值设置var2的值
3 /执行一个内部或外部子程序,其中%var%将作为运行时间值。

 @ECHO OFF SETLOCAL ENABLEDELAYEDEXPANSION FOR %%i IN (1 2 3) DO ( ECHO START of run %%i ECHO using ^!time^! : !time! - PARSE TIME was %time% CALL ECHO using CALL %%%%TIME%%%% : %%TIME%% CALL :report timeout /t 5 ECHO using ^!time^! : !time! CALL ECHO using CALL %%%%TIME%%%% : %%TIME%% CALL :report ECHO END of run %%i ECHO. ) GOTO :eof :report ECHO :report says TIME is %TIME% GOTO :eof 

几个项目要注意:

  1. 指令

    IF ERRORLEVEL n回声错误级别是n或者大于

    总是解释ERRORLEVEL的RUN-TIME值

  2. IF SET VAR 总是解释IF SET VAR的RUN-TIME值

  3. 像ERRORLEVEL和TIME这样的magic variables永远不应该被设置。 如果你执行

    SET ERRORLEVEL =哑

那么ERRORLEVEL将采用dumb值,因为环境中的当前值优先于系统分配的值。

在一个代码块(=包围parantheses)内,你需要delayed expansion!variables!而不是 %variables%

 :: ===================================== @setlocal @echo off @rem (1) call :testReturn aaa echo RESULT: aaa = %aaa% @rem (2) if "1" == "1" ( call :testReturn ccc setlocal enabledelayedexpansion echo RESULT: ccc = !ccc! endlocal ) goto :eof :testReturn set %~1=bbb exit /b endlocal