2017-07-31 44 views
0

該任務很容易從包含需要在源文件「source.txt」中替換的關鍵字的文件「input.txt」中接受輸入並創建新文件與關鍵字的名稱。你能否提出什麼是錯的建議。用於循環的批文件無法在循環內執行

@echo off &setlocal 
setlocal enableextensions disabledelayedexpansion 
set "search=POP" 
set "source=dev500_ABC_eu.env" 
for /f %%a in (input.txt) do (
set "replace=%%a" 
set "newfile=devga520_%replace%_eu.env" 
for /f "delims=" %%i in (%textfile%) do (
    set "line=%%i" 
    setlocal enabledelayedexpansion 
    set "line=!line:%search%=%replace%!" 
    echo(!line! 
    endlocal 
)>"%newfile%" 
) 

這裏在input.txt中,假設它有「PQR」。所以應該更換「PQR」的文件中「POP」和新的文件768,16名爲dev500_PQR_eu.env

Input file.txt 
line 1 --> PQR 
line 2 --> XYX 
line 3 --> NOB 
line 4 --> BOB 

總產值有望產生:與輸入文件替換字符「ABC」後的4個不同的文件文本例如:whereevr「ABC」在那裏它應該被dev500_ABC_eu.env中的PQR替換,並且新文件將被文本重命名。

dev500_PQR_eu.env --> replaced name and content as well by PQR. 
dev500_XYX_eu.env 
dev500_NOB_eu.env 
dev500_BOB_eu.env 

任何幫助將不勝感激。謝謝。

+0

除非您使用[延遲擴展](http://ss64.com/nt/delayedexpansion.html),否則不應該使用臨時變量'replace'和'newfile',只需指明'%% a'和' devga520 _ %% a_eu.env'而不是,resp .... – aschipfl

+0

我已經嘗試過,但是也執行第一個,結果只是第二個執行後創建的最後一個文件。第一個for循環的執行應該爲輸入文本文件中沒有發生的每個變量執行第二個for循環。有什麼建議麼。感謝您的幫助 – jaysc

回答

0
... 
set "source=dev500_ABC_eu.env" 
for /f %%a in (input.txt) do (set "replace=%%a") 
set "newfile=devga520_%replace%_eu.env" 
(
for /f "delims=" %%i in (%textfile%) do (
    set "line=%%i" 
    setlocal enabledelayedexpansion 
    set "line=!line:%search%=%replace%!" 
    echo(!line! 
    endlocal 
) 
)>"%newfile%" 

請參閱SO上的delayed expansion項目瞭解更多信息。代碼塊(括號中的一系列行)內的任何%var%將在第一次遇到塊時由值var替換。

您需要在塊外設置replace


您的修訂已澄清了一些事項。

@ECHO Off 
SETLOCAL 
SET "search=POP" 
set "source=dev500_ABC_eu.env" 
:: This is a replacement source file I used for testing... 
set "source=c:q45416169_1.txt" 
for /f %%a in (c:q45416169.txt) do (
set "replace=%%a" 
set "newfile=devga520_%%a_eu.env" 
CALL DEL %%newfile%% >NUL 2>nul 
for /f "delims=" %%i in (%source%) do (
    set "line=%%i" 
    setlocal enabledelayedexpansion 
    set "line=!line:%search%=%%a!" 
    >>!newfile! echo(!line! 
    endlocal 
) 
) 

我用了一個包含您的數據,我的測試命名​​文件。

我使用了一個名爲q45416169_1.txt的文件,其中包含一些用於測試的虛擬文本數據。

我在代碼中留下了replace的賦值,但它現在是多餘的。

+0

感謝Magoo。它適用於輸入文件只有一個關鍵字的情況。當它有多個關鍵字時,它會生成最後一個文件。我想替換函數首先執行,它設置所有的值和替換函數生成最後一個關鍵字的文件。 input.txt - > PQR XYZ LOL 在這種情況下,它生成文件dev500_LOL_eu.env。 我怎樣才能讓它替換和生成所有輸入的文件。 – jaysc

+0

在'for/f'語句的'/ f'和'%%'之間加上''delims =「''把整個行從文件中分配給變量,否則只分配第一個」令牌「有關詳細信息,請參閱提示中的for /?| more') – Magoo

+0

問題不同,輸入文件每行有一個關鍵字。所以實際上它會替換input.txt中的所有關鍵字,然後將最後一行中的最後一個關鍵字替換並生成新文件。第一個循環得到執行,它到達最後一個關鍵字,第二個循環將最後一個關鍵字作爲輸入並生成文件。 我想爲input.txt中的所有關鍵字生成文件,每行只有一個關鍵字。感謝您的幫助 – jaysc