windows批括号范围

mei*_*ine 2 windows scope batch-file parentheses

如何在用parantheses('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
Run Code Online (Sandbox Code Playgroud)

谢谢!!

Mag*_*goo 6

当要执行括在括号中的复合语句时,首先从开括号解析语句,直到匹配的闭括号.

在这个时候,任何%var%由替代var的价值从环境中的时候,它被解析(即其分析时的值.)

那么如果该语句似乎有效,则执行.

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

1/SETLOCAL ENABLEDELAYEDEXPANSION切换到!var!的模式 可用于访问运行时值var
2/CALL set var2=%%var%%以设置var2运行时值var
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
Run Code Online (Sandbox Code Playgroud)

一些注意事项:

  1. 指示

    IF ERRORLEVEL n echo errorlevel是n OR GREATER

    总是解释RUN-TIME的值ERRORLEVEL

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

  3. magic variables像ERRORLEVEL和时间不应该设置.如果你执行

    SET ERRORLEVEL =哑

然后ERRORLEVEL将采用该值,dumb因为环境中的当前值优先于系统分配的值.