搜索文本文件并在其中添加批处理文件中的行

时间:2017-05-11 20:13:37

标签: batch-file

我正在尝试编写一个可用于以下任务的批处理文件 - 搜索某些文本文件并在其中添加文本行 - 在指定行下方。我正在尝试使用以下方法:

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。 有人可以帮忙吗?

1 个答案:

答案 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恢复原始的当前目录。

额外的%是一个键控错误(我的正常机器生病了,我必须使用笔记本电脑 - 男孩,我厌恶键盘......)