2012-07-10 65 views
1

我是一名Perl程序員,但我需要爲特定任務執行Windows批處理文件。使用Windows批處理文件,如何解析文件並將其輸出到一個文件,然後輸出到另一個文件?

該腳本需要逐行讀取輸入文件,並複製到輸出文件。無論如何,它需要切換輸出文件。

對於閱讀輸入文件並輸出到一般文件,傑佈下面的文章中的解決方案似乎工作得最好。 (當輸入數據有奇怪的字符或長行時,其他解決方案不能很好地工作)Batch files: How to read a file?

但是我不能讓它工作在我更改輸出文件的途中。問題可能與DelayedExpansion的工作方式有關。

當我運行以下腳本時,outfile最後仍然是a.txt,並且未設置new_variable。

@echo off 
del /f/q a.txt 
del /f/q b.txt 
del /f/q c.txt 
del /f/q out.txt 

set outfile=a.txt 
SETLOCAL DisableDelayedExpansion 
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ in.txt"`) do (
    set "var=%%a" 
    SETLOCAL EnableDelayedExpansion 
    set "var=!var:*:=!" 
    IF "!%var!" == "/************************** PLUGINS SECTION *************************/" (
    set outfile=b.txt 
    set new_variable=this 
    echo "FOUND! Value of outfile should change to b.txt" 
) 
    echo(!outfile! !var! >>!outfile! 
    ENDLOCAL 
) 

echo Outfile:  %outfile% 
echo New Variable: %new_variable% 

回答

1

你放棄了你的變量變化後endlocal。
因此,您需要將值保存在endlocal屏障上。
這裏最簡單的方法是使用FOR-Endlocal技術。

SETLOCAL DisableDelayedExpansion 
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ in.txt"`) do (
    set "var=%%a" 
    SETLOCAL EnableDelayedExpansion 
    set "var=!var:*:=!" 
    if "!var!" == "****" (
     set outfile=b.txt 
     set new_variable=this 
    ) 
    FOR /F "tokens=1,2" %%O in (!outfile! !new_variable!) DO 
    (
    ENDLOCAL 
    set "outfile=%%O" 
    set new_variable=%%P 
) 
) 

這個工程作爲%% O和for循環的%% p參數都不會受到ENDLOCAL
這兩個值都是在屏障上緩存

相關問題