2011-07-25 23 views
1

我是新編寫批處理文件;它的語法讓我嘔吐,所以我儘量遠離。長話短說,我需要一種快速簡單的方法來檢查大量數據並將其全部導出到Windows中的.csv文件中。我寫了一個簡單的小批處理文件來爲我完成這項工作。批處理文件中的變量範圍

我有一些變量的問題。這段代碼的想法是構建一串由逗號分隔的數據,然後回顯輸出。另一個文件將捕獲輸出,但這並不重要。

這裏是顯示我有這個問題的一些僞代碼,我遇到了這個問題好幾次,都顯著重組我的代碼,以儘量避免它

setlocal EnableDelayedExpansion 
::pseudo code for loop 
LOOP THROUGH LIST OF FILE PATHS PUTTING THEM INTO %%B do (

set str=, ::reset str 

other code 

if exist %%B ( 

    other code 

    ::echos the file path and checks if it is a specific file i need to search 
    echo %%B 2> NUL | find /I /N %%B "%phrase_0_%" > NUL 
    if %ERRORLEVEL% == 0 ( 

     ::HERE IS THE PROBLEM SEE BELOW FOR MORE INFO 

     type %%B 2> NUL | find /I /N "%phrase_1_%" > temp.txt 
     set /p var=<temp.txt 
     set "str=!str!%var%," 
     del temp.txt 

     type %%B 2> NUL | find /I /N "%phrase_2_%" > temp.txt 
     set /p var=<temp.txt 
     set "str=!str!%var%," 
     del temp.txt 
    ) 

) else (::OTHER CODE) 

echo !str! 
) 
endlocal 

好吧,這裏就是我的想法問題是。我一直遇到嵌套的變量調用問題。我會用這個方便的循環技巧來將一個命令的輸出放入一個變量中,但它需要另一個層次的嵌套,這意味着更改變量的值時會遇到更多麻煩。你可以看到,我能惹%STR%內:

if exists %%B(

使用SETLOCAL EnableDelayedExpansion和STR!廢話。但是當我去另一個層面下來

if %ERRORLEVEL% == 0 

做你們有什麼問題可能是一些建議或解決方案可能是什麼都不行?

回答

2

無論嵌套級別如何,延遲擴展都可以工作。但您有其他問題,反正這裏:

set /p var=<temp.txt 
set "str=!str!%var%," 

你期望%var%什麼價值,有沒有?您正在設置一個值,並在一個塊內連續使用兩行。你也需要延遲擴展。

+0

我期望'%var%'擁有的是'type %% B 2> NUL |找到/ I/N「%phrase_2 _%」'命令。它應搜索文件中的特定短語並打印行和行號。 你是否建議解決方案將設置爲「str =!str !! var!,」'? – Newbie

+0

當然。在實際輸入最外面的塊之前,'%var%'將被替換。 – Joey