2013-05-31 44 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