2013-05-31 47 views
2

如何在包含pain('if'或'for'循环)的作用域中设置结果变量。结果是正确的(>> RESULT:aaa = bbb),当直接调用过程时,在for循环或if语句(>> RESULT:ccc =)中使用时失败。windows批处理括号范围

:: ===================================== 
@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 

谢谢!!

回答

1

码块(=带括号包围)需要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 
+0

谢谢Endoro!简单但非常有帮助。问题解决了 - 找到一些长度的文件: 'code' FOR/F %%的F( 'DIR/B * .PNG')做( \t电话:strlen的结果%%˚F \t SETLOCAL enabledelayedexpansion \t如果/我 “!导致!” == “6” ... ... SOME_WORK \t ENDLOCAL ) 转到:EOF :strlen的 SETLOCAL 组字符串=%〜2 组字符串=%字符串: “=%^ &FOR/F “delims =” %%一个在( '设置字符串^ | FINDSTR/O $')做( 集合/ A ST r_len = %% a-9) (endlocal&set“%〜1 =%str_len%” exit/b) 'code' – meine

+0

@meine - 无法在此评论中读取您的代码。把它放在pastebin或(更好)提出一个新问题。 – Endoro

+0

这不是一个新问题,而只是整个脚本的一部分,您的答案对我有帮助。 :) – meine

6

当包含在括号中的复合语句将被执行, 该语句被第一解析从左括号的全部 的方式到匹配的右括号。

在这个时候,任何%var%var的值代替从 环境在当时被解析(即其分析时值。)

THEN如果声明似乎有效,它被执行。

有访问 变量的RUN-TIME值的三种常用的方法(作为一个FOR循环的执行方式,例如。)

1/SETLOCAL ENABLEDELAYEDEXPANSION其切换到一个模式,其中 !变种!可用于访问的var
2/CALL set var2=%%var%%运行值与来自的var
运行值设置的var2值/执行子程序,内部或外部的在其内%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或更大

    ALWAYS解释运行时值ERRORLEVEL

  2. IF SET VARALWAYS解释的VAR

  3. magic variables像ERRORLEVEL运行时间值和时间应永远 设置。如果执行

    SET ERRORLEVEL =哑

然后ERRORLEVEL将采用价值dumb因为在当前环境下的 值在系统指定的值优先。

+0

谢谢你,这么详细的解释读取羽典它帮助我肯定我的未来脚本和当前问题解决得 - !。需要的文件需要一些工作长度。 – meine