我怎样才能设置结果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
几个项目要注意:
指令
IF ERRORLEVEL n回声错误级别是n或者大于
总是解释ERRORLEVEL
的RUN-TIME值
IF SET VAR
总是解释IF SET VAR
的RUN-TIME值
像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