2013-03-08 122 views
1

我想創建一個批處理文件來讀取循環中文件的每一行,並用另一個文件替換字符串。以下是我的代碼片段:批處理文件讀取文件並替換一個新字符串

for /F "tokens=*" %%i in (myfile) do (
    set str=%%i 
    set str=%str: %oldstring% = %newstring%% 
echo %str% >> newfile 
) 

這會導致一個新的文件'Echo is off'與myfile中的行數一樣多。看起來像str變量在分配給%% i時根本沒有任何值。有人能幫我嗎?

回答

3

試試這個小腳本:

@echo off 
set val=50 
echo %val% 
for /l %%i in (1,1,1) do (
    set val=%%i 
    echo %val% 
) 
echo %val% 
pause>nul 

輸出是:

50 
50 
1 

跟預期不一樣,對吧?

這是因爲在for循環中,直到循環結束才更新變量。爲了解決這個問題,你可以使用setlocal enabledelayedexpansion,並更換百分號(%)帶有感嘆號(!):

@echo off 
setlocal enabledelayedexpansion 
set val=50 
echo %val% 
for /l %%i in (1,1,1,) do (
    set val=%%i 
    echo !val! 
) 
echo %val% 
pause>nul 

輸出:

50 
1 
1 

的原因str變量持有沒有價值(在for循環中)是因爲它尚未事先設置。

因此,通過這些快速修改,你的腳本將工作...

setlocal enabledelayedexpansion 
for /f "tokens=*" %%i in (myfile) do (
    set str=%%i 
    set str=!str: %oldstring% = %newstring%! 
    echo !str! >> newfile 
) 

順便說一句,這個片斷是假設oldstringnewstring不會在for循環中進行設置,否則事情會變得亂。

玩得開心。

+0

謝謝萬億不刪除空格! !我在批量編程方面絕對是新的。我以前見過'setlocal enabledelayedexpansion',但dint知道它的功能。因此從未使用它。謝謝你的解釋。是的,oldstring&newstring被設置在循環之外,我的代碼現在工作正常!再次感謝.. :) – Joyel 2013-03-11 07:19:19

+0

@ user2147904它是否回答你的問題,如果有,請點擊接受。如果它只是幫助,upvote。 – 2013-03-11 07:21:11

+0

嗨,Pickle教授,我還有一個問題。我認爲你不能在str之後留出空間:現在,假設oldstring是在for循環內分配(並更改)的變量。然後我們必須使用set str =!str:!oldstring!=%newstring%!.但它在遇到2nd時不起作用,它終止了目的。解決辦法是什麼?請幫忙。 – Joyel 2013-03-11 10:50:13

1

花了一些時間在這我得到了正確的方法:

@echo off 
setlocal enabledelayedexpansion 

set oldstring=AF-07295 
set /a count=1000 

for %%f in (*.*) do (
    set /a count=!count!+1 
    for /f "tokens=*" %%i in (%%f) do (
    set str=%%i 

    call set str=%%str:!oldstring!=!count!%% 
    echo !str! >> %%~nf.ordnew 

) 
) 

endlocal 
1
setlocal ENABLEDELAYEDEXPANSION 
set filein="c:\program files\test1.txt" 
set fileout="c:\program files\test2.txt" 
set [email protected]@ 
set new=2.0.3 
for /f "tokens=* delims=¶" %%i in ('"type %filein%"') do (
    set str=%%i 
    set str=!str:%old%=%new%! 
    echo !str! >> %fileout% 
) 

工作完美 ,並在開始時的行文件

相關問題