2014-01-27 32 views
5

當我嘗試創建一個'dos'(windows 7命令行)批處理文件,它執行一些字符串操作來創建新文件路徑時,我遇到了一個奇怪的變量作用域問題。任何人都可以看到爲什麼OUTPUT_FILENAME變量總是在下面的例子中變爲null?批處理文件變量範圍問題

echo Enter the Data Input, S (Site) or U (User) 
set /p DATA_TYPE= 
echo. 
echo Enter the Input File Name 
set /p INPUT_FILENAME= 
echo. 
IF /I %DATA_TYPE%==u (
    set OUTPUT_FILENAME=%INPUT_FILENAME:\users\=\Users\Outputs\% 
    set OUTPUT_FILENAME=%OUTPUT_FILENAME:xls=txt% 
    echo Output: 
    echo %OUTPUT_FILENAME% 
) 
IF /I %DATA_TYPE%==s (
    set OUTPUT_FILENAME=%INPUT_FILENAME:\sites\=\Sites\Outputs\% 
    set OUTPUT_FILENAME=%OUTPUT_FILENAME:xls=txt% 
    echo Outputs: 
    echo %OUTPUT_FILENAME% 
) 

在此先感謝您的任何幫助,這讓我瘋狂!

回答

4

您需要啓用延遲擴展:

setlocal EnableDelayedExpansion 
echo Enter the Data Input, S (Site) or U (User) 
set /p DATA_TYPE= 
echo. 
echo Enter the Input File Name 
set /p INPUT_FILENAME= 
echo. 
SET OUTPUT_FILENAME=Empty 
IF /I %DATA_TYPE%==u (
    set OUTPUT_FILENAME=!INPUT_FILENAME:\users\=\Users\Outputs\! 
    set OUTPUT_FILENAME=!OUTPUT_FILENAME:xls=txt! 
    echo Output: 
    echo !OUTPUT_FILENAME! 
) 
IF /I %DATA_TYPE%==s (
    set OUTPUT_FILENAME=!INPUT_FILENAME:\sites\=\Sites\Outputs\! 
    set OUTPUT_FILENAME=!OUTPUT_FILENAME:xls=txt! 
    echo Outputs: 
    echo !OUTPUT_FILENAME! 
) 

至於幫助的SET命令狀態:

延遲環境變量擴充是圍繞當前擴張的侷限性越來越有用哪些發生在讀取一行文本時,而不是執行時。

因此,您需要使用延遲擴展來確保INPUT_FILENAMEOUTPUT_FILENAME的值在執行時被擴展。

+0

非常感謝您的支持。這是我第一次嘗試在批處理文件中進行任何實際的流量控制,所以我一定會在未來對此進行記錄! – user3241379

3

正如Laf已經正確指出的那樣,代碼需要延遲擴展。在批處理文件中,當一行或一個塊(括號中的所有行)到達時,在執行之前會對其進行分析。在這個分析階段,每個變量的讀取都會被替換爲之前變量的執行開始。

如果在塊內部更改變量,並且想要在同一個塊內訪問此更改的值,則需要延遲擴展。在LAF答案的代碼反映該怎麼辦呢

或者,如果可能的話,你可以改變你的代碼並不需要它

echo Enter the Data Input, S (Site) or U (User) 
set /p DATA_TYPE= 
echo. 
echo Enter the Input File Name 
set /p INPUT_FILENAME= 
echo. 
IF /I %DATA_TYPE%==u (
    set OUTPUT_FILENAME=%INPUT_FILENAME:\users\=\Users\Outputs\% 
) 
IF /I %DATA_TYPE%==s (
    set OUTPUT_FILENAME=%INPUT_FILENAME:\sites\=\Sites\Outputs\% 
) 
set OUTPUT_FILENAME=%OUTPUT_FILENAME:xls=txt% 
echo Output: 
echo %OUTPUT_FILENAME% 

現在,裏面有塊更改的變量,但是值然後訪問塊之外。

+0

感謝您的額外信息 - 我已經使用了Laf的解決方案,因爲它更適合批處理文件的其餘部分(上面的代碼片段只是一個摘錄),但這也是有用的知道。 – user3241379