在批量搜索和替换脚本中包括双引号

时间:2017-01-10 21:34:59

标签: batch-file

我在许多远程计算机上有一个配置文件,我需要通过使用批处理脚本来修改它。配置文件有两行,如下所示:

1_IP = "10.101.34.216"
2_IP = "10.101.34.214"

我只需交换两个IP,但我很难过。

理想情况下,我会编写一个简单的脚本来搜索10.101.34.216并将其替换为10.101.34.214,反之亦然 - 但是,如果我将来意外地在远程计算机上运行该脚本,它只会恢复原状。

因此,我需要设置搜索参数以准确查找1_IP = "10.101.34.216"并将其替换为1_IP = "10.101.34.214",然后将2_IP = "10.101.34.214"的精确搜索替换为2_IP = "10.101.34.216" 1}}

我目前正在使用以下脚本,我在一个单独的stackoverflow帖子中找到了该脚本。

@echo off 
setlocal enableextensions disabledelayedexpansion

set "search=%1"
set "replace=%2"

set "textFile=system.cfg"

for /f "delims=" %%i in ('type "%textFile%" ^& break ^> "%textFile%" ') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%search%=%replace%!"
    >>"%textFile%" echo(!line!
    endlocal
)

但是,如果我将搜索参数设置为

set search= "1_IP = "10.101.34.216" "

由于双引号,它不起作用。我已经尝试了几种方法来逃避双引号,但我似乎无法让它工作。有什么建议吗?

提前感谢您的时间,耐心和专业知识。

3 个答案:

答案 0 :(得分:2)

由于1_IP =2_IP =后面的当前字符串似乎并不重要,我不会尝试替换它们,但我会简单地编写所需的字符串,如下所示(请参阅所有说明{ {1}}评论):

rem

如果您希望能够预定义任意数量的键和值,并保留空行,则可能需要使用此脚本:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_FILE=%~dp0system.cfg" & rem // (path/name of file to process)
set "_KEY[1]=1_IP"          & rem // (1st key to search for)
set "_KEY[2]=2_IP"          & rem // (2nd key to search for)
set "_VAL[1]=10.101.34.214" & rem // (1st value to assign to 1st key)
set "_VAL[2]=10.101.34.216" & rem // (2nd value to assign to 2nd key)

rem // Read specified file and iterate through all (non-empty) lines:
for /F delims^=^ eol^= %%L in ('type "%_FILE%" ^& ^> "%_FILE%" rem/') do (
    rem // Write (append) to the specified file:
    >> "%_FILE%" (
        rem // Split key from value (key must not contain spaces):
        for /F "eol== delims== " %%K in ("%%L") do (
            rem /* If key is a predefined one return respective value;
            rem    otherwise return the current line unedited: */
            if /I "%%K"=="%_KEY[1]%" (
                echo(%%K = "%_VAL[1]%"
            ) else if /I "%%K"=="%_KEY[2]%" (
                echo(%%K = "%_VAL[2]%"
            ) else (
                echo(%%L
            )
        )
    )
)

endlocal
exit /B

答案 1 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q41578841.txt"
SET "outfile=%destdir%\outfile.txt"
SET "search1=1_IP = \"10.101.34.216\""
SET "search2=2_IP = \"10.101.34.214\""
SET "replace1=1_IP = "10.101.34.214""
SET "replace2=2_IP = "10.101.34.216""

SET "replaced=N"
(
FOR /f "usebackqtokens=1*delims=" %%a IN ("%filename1%") DO (
 ECHO(%%a|FINDSTR /x /L /C:"%search1%" >NUL
 IF ERRORLEVEL 1 (
  ECHO(%%a|FINDSTR /x /L /C:"%search2%" >NUL
  IF ERRORLEVEL 1 (ECHO(%%a
  ) ELSE (SET "replaced=Y"&ECHO(%replace2%
  )
 ) ELSE (SET "replaced=Y"&ECHO(%replace1%
 )
)
)>"%outfile%"

IF %replaced%==Y (MOVE "%outfile%" "%filename1%">nul&ECHO made changes
) ELSE (DEL "%outfile%"&echo no changes made
)

GOTO :EOF

您需要更改sourcedirdestdir的设置以适合您的具体情况。

我使用了一个名为q41578841.txt的文件,其中包含您的数据以及一些用于测试的虚拟数据。

%outfile%可以用作临时文件。它的名称不相关,只需要在作业运行时不存在。

读取每个文件行。如果该行完全匹配(/x)搜索字符串(/c:,因为它可能包含空格,/L字面意思 - /i不区分大小写,则设置{{ 1}} 0.如果两者都不匹配,则回流该行,否则输出替换行并标记替换发生。

最后,要么替换文件,要么删除虚拟输出文件并报告。

答案 2 :(得分:0)

它不漂亮,但什么时候是Windows Shell脚本?...:

@echo off

setlocal

set TEXT_FILE=.\system.cfg
set IP_1=
set IP_2=
for /f "tokens=*" %%L in (%TEXT_FILE%) do call :PROCESS_LINE %%L

echo 1_IP = "%IP_2%"
echo 2_IP = "%IP_1%"

endlocal
goto END

:PROCESS_LINE
set PL_LINE=%*
set PL_LINE=%PL_LINE:"=%
if "%PL_LINE:~0,4%" == "1_IP" set IP_1=%PL_LINE:~7%
if "%PL_LINE:~0,4%" == "2_IP" set IP_2=%PL_LINE:~7%
goto END

:END