我在许多远程计算机上有一个配置文件,我需要通过使用批处理脚本来修改它。配置文件有两行,如下所示:
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" "
由于双引号,它不起作用。我已经尝试了几种方法来逃避双引号,但我似乎无法让它工作。有什么建议吗?
提前感谢您的时间,耐心和专业知识。
答案 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
您需要更改sourcedir
和destdir
的设置以适合您的具体情况。
我使用了一个名为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