我正在尝试编写一个可用于以下任务的批处理文件 - 搜索某些文本文件并在其中添加文本行 - 在指定行下方。我正在尝试使用以下方法:
dir /s /a /b "%SystemDrive%\config*.ini" >> %userprofile%\temp.txt
for /F "tokens=* delims=," %%G IN (%userprofile%\temp.txt) DO (echo "%%G" >> %userprofile%\temp2.txt)
for /F "tokens=* delims=," %%G IN (%userprofile%\temp2.txt) DO (
SETLOCAL ENABLEDELAYEDEXPANSION
cd %%~dG%%~pG
set inputFile=%%~nG%%~xG
set outputFile=in.tmp
set _strInsert=TCPPortNumber=870
set _strFind=Random=No
FOR /F "usebackq delims=" %%A IN ("%inputFile%") DO (
Echo %%A | Find "%_strFind%" && ECHO %%A>>"%outputFile%" && ECHO %_strInsert%>>"%outputFile%"
IF [!errorlevel!] == [1] ECHO %%A>>"%outputFile%"
)
MOVE /Y "%outputFile%" "%inputFile%" && DEL /F /Q "%outputFile%"
搜索config*.ini
个文件并将结果写入temp.txt
。插入引号,以防temp.txt
中每行的文件路径中有空格 - > temp2.txt
。然后,temp2.txt
中的每个文件路径都尝试在TCPPortNumber=870
行下方插入Random=No
。如果我使用“硬”文件路径,这种方法可行,但是从temp2.txt
读取文件路径时,它会给我一个错误:The system cannot find the file specified
。
有人可以帮忙吗?
答案 0 :(得分:0)
SETLOCAL ENABLEDELAYEDEXPANSION
dir /s /a /b "%SystemDrive%\config*.ini" >> %userprofile%\temp.txt
set outputFile=in.tmp
set _strInsert=TCPPortNumber=870
set _strFind=Random=No
for /F "usebackqdelims=" %%G IN ("%userprofile%\temp.txt") DO (
pushd %%~dpG
FOR /F "usebackq delims=" %%A IN ("%%~nxG") DO (
ECHO %%A>>"%outputFile%"
Echo %%A | Find "%_strFind%" && >>"%outputFile%" ECHO %_strInsert%
)
MOVE /Y "%outputFile%" "%%~nxG"
popd
)
endlocal
setlocal
命令不应该在循环内(除非它与endlocal
匹配)因为它不是一个开关,而是建立一个帧,因此在循环内{{1}正在建立许多嵌套的本地环境。
三个常量字符串也应该出现在循环之外,因为它们的值不会改变。
第二个临时文件不是必需的,因为它只是引用每一行的第一个。
由于cmd
可能包含空格,因此需要%temp%
... %% G for/f
usebackq needs to have the filename quoted, and consequently the
%% G option. The line is to be accepted into
delims =`关闭分隔符。
可以组合子字符串选择器,因此in its entirity, so
提供驱动器和路径,并~dp
提供名称和扩展名。
在原始代码中,~nx
正在设置中,但inputfile
在整个块(括号内的序列行)时将被解析为%inputfile%
的值)因为值通过执行代码而改变,所以不在运行时解析。这是常见的inputfile
问题 - SO上有数百个引用。
由于似乎需要在特定行之后插入一行,我们可以简单地重现每一行,然后查看是否需要插入,这简化了代码。重定向器放置在delayed expansion
之前,通过在重定向器前面加上设备号来克服选择要重定向的设备的Windows-NT特性。
最后,echo
强制用输出文件替换输入文件,因此输出文件将不再存在
我实际上没有尝试过这段代码 - 您应该针对真实数据的一个小的复制子树执行它,并在依赖它之前对其进行评估。
小修补程序 - 将原始move /y
更改为cd
并添加了相应的pushd
也删除了多余的popd
PUSHD将当前目录更改为指定的目录。 POPD恢复原始的当前目录。
额外的%
是一个键控错误(我的正常机器生病了,我必须使用笔记本电脑 - 男孩,我厌恶键盘......)