2

我想创建一个批处理文件来循环读取文件的每一行并用另一个字符串替换一个字符串。以下是我的代码片段:

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

这会产生一个带有“Echo is off”的新文件,其行数与 myfile 中的行数一样多。似乎 str 变量在分配给 %%i 时根本没有任何值。有人能帮我吗?

4

3 回答 3

4

试试这个小脚本:

@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不会在 forloop 中设置,否则事情会变得一团糟。

玩得开心。

于 2013-03-08T10:31:00.617 回答
1
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% 
)

工作完美,并没有在行文件的开头删除空格

于 2014-03-28T14:08:16.000 回答
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
于 2013-10-11T14:34:33.860 回答