2011-01-22 34 views
1

好球員,讓我試着解釋我的問題:批處理腳本:從功能1局部變量函數2

我開始用一條線從那裏我開始2個不同的功能

setlocal EnableDelayedExpansion 
for %%i in ("C:\*.*") do (
call :function1 "%%~i" 
call :function2 "%%~i" 
) 
goto :eof 

在功能1,在我在本地環境中做了一個SET:

setlocal EnableDelayedExpansion 
... 
... 
set name1=blabla 
endlocal & SET name=%name1% 
echo %name% 
goto :eof 

echo會返回我的變量。現在到我的問題。 我退出功能之一,我去功能2(見第一代碼段) 我不能在這裏調用變量形式。我嘗試了function2,我在調用function2之前試過,但都沒有解決問題。

我的猜測是隻設置了function1的局部變量。我搜索網絡,但我讀到,行「endlocal & SET name =%name1%」應該已經解決了我的問題。

我希望我已經解釋清楚了,所有幫助表示感謝!

回答

1

我不知道您的問題所在,因爲這完美的作品:

@setlocal enableextensions enabledelayedexpansion 
@echo off 
set name=ORIGNAME 
for %%i in (1 2) do (
    call :function1 %%i 
    echo in main %name% !name! 
) 
endlocal 
goto :eof 

:function1: 
    setlocal enableextensions enabledelayedexpansion 
    set name1=%1_blabla 
    endlocal & SET name=%name1% 
    echo in function %name% 
    goto :eof 

輸出:

in function 1_blabla 
in main ORIGNAME 1_blabla 
in function 2_blabla 
in main ORIGNAME 2_blabla 

的是,當你在主要領域使用name一定,你用!name!而不是%name%

如果您使用的是%name%變體,則在整個for循環被讀取時進行評估,而不是在使用它時(換句話說,它將是空白)。您可以在main行中看到ORIGNAME的輸出。

我不確定是因爲你的使用延遲擴展。但是,爲了以防萬一,我想我會提到它。我總是使用延遲擴展和我總是使用環境變量的!變種,因爲它更接近我希望殼工作。

在任何情況下,我給出的代碼工作正常,所以你可能想擺弄這個,看看你是否可以將它合併到你自己的。

+0

好吧,我的愚蠢沒有嘗試簡化版本。感謝您的答案。爲了確保我沒有錯過任何東西,我會再次瀏覽代碼。如果我沒有找到問題,我會回來;)謝謝你的答案paxdiablo! – Rps 2011-01-22 10:05:50

+0

我解決了這個問題,把兩個函數放在一起。 我現在不稱它來解決問題,但繞過一個問題;) – Rps 2011-01-22 21:53:47

1

首先一個小型的工作樣本

@echo off 
setlocal EnableDelayedExpansion 

call :myAdd returnVar 1 2 
echo 1. Percent %returnVar% 
echo 1. Exlcam !returnVar! 

(
call :myAdd returnVar 4 5 
echo 2. Percent %returnVar% 
echo 2. Exlcam !returnVar! 
) 
goto :eof 

:myAdd 
setlocal 
set /a result=%2 + %3 

(
    endlocal 
    set %1=%result% 
    goto :eof 
) 

---- Output ---- 
1. Percent 3 
1. Exlcam 3 
2. Percent 3 
2. Exlcam 9 

了錯誤的結果「2百分比」的原因是%VAR%的擴大的結果。
它們在解析時展開,在執行括號塊的任何一行之前,所以在returnVar中存在舊值。

但這也是爲什麼從函數返回變量的原因。
endlocal刪除所有局部變量,但塊(與&符號工作方式相同) 在執行「endlocal」之前展開。

用「echo on」測試這個問題是個好主意。