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

问题描述:

我正在使用此bat文件将web.config中的值从httpTransport修改为httpsTransport。如果我将输出指向另一个文件,效果很好。如果我尝试覆盖我的文件,它会创建一个空文件。用于替换字符串的bat脚本创建空文件

@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% 

任何帮助将éapreciated

+3

您需要输出到新文件。替换之后,将新文件重命名为原始文件。吻。 – Squashman

+0

是的,发现了,但重命名只是dosen't重命名文件....添加新版本 – TBogdan

+0

我知道为什么...我有我的整个路径在INTEXTFILE,这是错误的,它应该只是“网络。 config“ – TBogdan

下面的代码的情况下,失败都INTEXTFILEOUTTEXTFILE指向同一个文件,因为输出重定向>准备在开始输出文件,因此它创建一个空文件,然后由findstr读:

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

通过更换也不起作用,因为这会将新数据附加到原始文件。


为了克服这个问题,你有两个选择:

  1. 要写入不同的文件,并用新的末来替换原文件:

    set "INTEXTFILE=D:\teste_bat\Web.config" 
    set "OUTTEXTFILE=D:\teste_bat\WebTemp.config" 
    > "%OUTTEXTFILE%" (
        for /f "delims=" %%i in ('findstr "^" "%INTEXTFILE%"') do (
         set "line=%%i" 
         setlocal enabledelayedexpansion 
         set "line=!line:%search%=%replace%!" 
         echo(!line! 
         endlocal 
        ) 
    ) 
    move /Y "%OUTTEXTFILE%" "%INTEXTFILE%" 
    

    由于更好的性能,这是推荐的变体。

  2. 要确保读取文件时前应用输出重定向:

    set "INTEXTFILE=D:\teste_bat\Web.config" 
    set "OUTTEXTFILE=D:\teste_bat\Web.config" 
    for /f "delims=" %%i in ('findstr "^" "%INTEXTFILE%" ^& ^> "%OUTTEXTFILE%" rem/') do (
        set "line=%%i" 
        setlocal enabledelayedexpansion 
        set "line=!line:%search%=%replace%!" 
        >> "%OUTTEXTFILE%" echo(!line! 
        endlocal 
    ) 
    

    这是在性能上,因为有多个文件访问操作(追加到每由于每次循环迭代文件更糟到>>),但它可以防止需要临时文件。在被findstr读取之后,部分> "%OUTTEXTFILE%" rem/耗尽文件,然后将其附加到稍后的循环体中。