[英]A Batch file to read a file and replace a string with a new one
我想创建一个批处理文件,以在循环中读取文件的每一行,并用另一个替换字符串。 以下是我的代码段:
for /F "tokens=*" %%i in (myfile) do (
set str=%%i
set str=%str: %oldstring% = %newstring%%
echo %str% >> newfile
)
这将导致一个新文件,其中“ Echo is off”与myfile中的行数一样多。 好像str变量分配给%% i时根本没有任何值。 有人能帮我吗?
试试这个小脚本:
@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
)
顺便说一句,这个片断是假设oldstring
和newstring
不会在for循环中进行设置,否则事情会变得混乱。
玩得开心。
花了一些时间我得到了正确的方法:
@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
setlocal ENABLEDELAYEDEXPANSION
set filein="c:\program files\test1.txt"
set fileout="c:\program files\test2.txt"
set old=@VERSION@
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%
)
工作完美,并且在lines文件开头没有删除空格
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.