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

时间:2016-11-10 13:17:48

标签: 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_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%

任何帮助都会被贬低

1 个答案:

答案 0 :(得分:1)

以下代码在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
    )
    

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