2

如何在用括号('if'或'for'-loop)包围的范围内设置结果变量。结果是正确的(>> 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

谢谢!!

4

2 回答 2

6

当要执行括在括号中的复合语句时,该语句首先从左括号一直解析到匹配的右括号。

此时,any%var%将替换为在它被解析时var来自环境的值(即它的PARSE-TIME值。)

那么如果该语句看起来有效,它就会被执行。

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

1/SETLOCAL ENABLEDELAYEDEXPANSION切换到 !var! 可用于访问var
2/的运行时值,以从 3/ 的运行时值CALL set var2=%%var%%设置 的值 执行子程序,内部或外部,其中 将是运行时值。var2var
%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 或更大

    ALWAYS解释 RUN-TIME 值ERRORLEVEL

  2. IF SET VAR ALWAYS解释 RUN-TIME 值VAR

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

    设置错误级别=哑

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

于 2013-05-31T08:20:36.137 回答
1

在代码块内(=用括号括起来)你需要delayed expansionand !variables!not %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
于 2013-05-31T08:19:36.027 回答