Batch file 用于替换字符串的bat脚本将创建空文件

Batch file 用于替换字符串的bat脚本将创建空文件,batch-file,replace,config,Batch File,Replace,Config,我使用这个bat文件将web.config中的一个值从httpTransport修改为httpsTransport。如果我将输出定向到另一个文件,效果会很好。如果我试图覆盖我的文件,它会创建一个空文件 @echo off &setlocal set "search=httpsTransport" set "replace=http123Transport" set INTEXTFILE=D:\teste_bat\Web.config set OUTTEXTFILE=D:\teste_ba

我使用这个bat文件将web.config中的一个值从httpTransport修改为httpsTransport。如果我将输出定向到另一个文件,效果会很好。如果我试图覆盖我的文件,它会创建一个空文件

@echo off &setlocal
set "search=httpsTransport"
set "replace=http123Transport"
set INTEXTFILE=D:\teste_bat\Web.config
set OUTTEXTFILE=D:\teste_bat\WebTemp.config

(for /f "delims=" %%i in ('findstr "^" "%INTEXTFILE%"') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%search%=%replace%!"
    echo(!line!
    endlocal
))>>"%OUTTEXTFILE%"

del %INTEXTFILE%

rename %OUTTEXTFILE% %INTEXTFILE%

如果
INTEXTFILE
OUTTEXTFILE
都指向同一个文件,则以下代码将失败,因为输出重定向
在开始时准备输出文件,因此它会创建一个空文件,然后由
findstr
读取:

set“INTEXTFILE=D:\teste\u bat\Web.config”
设置“OUTTEXTFILE=D:\teste\u bat\Web.config”
>%OUTTEXTFILE%(
对于/f“delims=“%%i in('findstr“^”“%INTEXTFILE%”)do(
设置“行=%%i”
延迟扩展
设置“行=!行:%search%=%replace%”
回声(!线!
端部
)
)
>
替换
也不起作用,因为这会将新数据附加到原始文件中


要克服这一问题,您有两个选择:

  • 要写入其他文件并在结尾处用新文件替换原始文件,请执行以下操作:

    set“INTEXTFILE=D:\teste\u bat\Web.config”
    设置“OUTTEXTFILE=D:\teste\u bat\WebTemp.config”
    >%OUTTEXTFILE%(
    对于/f“delims=“%%i in('findstr“^”“%INTEXTFILE%”)do(
    设置“行=%%i”
    延迟扩展
    设置“行=!行:%search%=%replace%”
    回声(!线!
    端部
    )
    )
    移动/Y“%OUTTEXTFILE%”“%INTEXTFILE%”
    
    由于性能更好,这是推荐的变体

  • 要确保在应用输出重定向之前读取文件,请执行以下操作:

    set“INTEXTFILE=D:\teste\u bat\Web.config”
    设置“OUTTEXTFILE=D:\teste\u bat\Web.config”
    对于/f“delims=“%%i in('findstr“^”“%INTEXTFILE%”^&^>“%OUTTEXTFILE%”rem/”)do(
    设置“行=%%i”
    延迟扩展
    设置“行=!行:%search%=%replace%”
    >>“%OUTTEXTFILE%”回显(!行!
    端部
    )
    
    由于存在多个文件访问操作(由于
    >
    的原因,每次循环迭代都会将文件追加到文件中),因此性能更差,但这会阻止对临时文件的需要rem/在被
    findstr
    读取后耗尽文件,然后将其附加到后面的循环体中


  • 您需要输出到一个新文件。替换后,只需将新文件重命名为原始文件。K.I.S.S.Yup,发现了,但重命名没有重命名文件…添加了新版本我知道为什么…我的整个路径都在INTEXTFILE中,这是错误的,它应该只为“web.config”当它试图将一个文件重命名为一个已经存在的文件时,您在屏幕上看到了错误。那么,是什么阻止您在重命名新文件之前先使用delete命令删除原始文件。您的另一个选项是使用
    MOVE/Y