String 读取文件并用新字符串替换字符串的批处理文件

String 读取文件并用新字符串替换字符串的批处理文件,string,batch-file,replace,String,Batch File,Replace,我想创建一个批处理文件来读取循环中文件的每一行,并用另一行替换字符串。以下是我的代码片段: for /F "tokens=*" %%i in (myfile) do ( set str=%%i set str=%str: %oldstring% = %newstring%% echo %str% >> newfile ) 这将生成一个新文件,其中的“Echo is off”行数与myfile中的行数相同。似乎str变量在分配给%%i时根本不包含任何值。有人能帮我吗?试试这个

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

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
,并将百分号(
%
)替换为感叹号(
):

输出:

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
)
顺便说一句,这个代码段假设forloop中不会设置
oldstring
newstring
,否则事情会变得一团糟


玩得开心。

在这方面花了一些时间,我找到了正确的方法:

@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”,但我不知道它的功能。因此从未使用过它。谢谢你的解释。是的,oldstring和newstring设置在循环之外,我的代码现在可以正常工作了!再次感谢..:)@user2147904是否回答了您的问题,如果回答了,请单击“接受”。如果这有帮助的话,请投票。嗨,皮克教授,我还有一个问题。我想你不能在str:。现在,假设oldstring是在for循环中分配(并更改)的变量。然后我们必须使用set str=!str:!旧字符串!=%新闻字符串%!。但是当它遇到第二个时,它就不起作用了!,它终止了目的。解决办法是什么?请帮助。请尝试设置str=%str:!旧字符串!新闻字符串!%我正在使用手机,因此无法测试它。您能否避免在
for
循环中设置
%oldstring%
@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% 
)