【问题标题】:Batch File - Replace Keyword in txt files批处理文件 - 替换 txt 文件中的关键字
【发布时间】:2017-06-12 15:03:03
【问题描述】:

我正在尝试制作一些 BAT 文件,这些文件将扫描所有扩展名为 .txt 的文件,列出它们并替换多个关键字。我不知道txt文件名是什么。

这是我得到的:

@echo off

setlocal enabledelayedexpansion

set /a counter=1
set "SEARCH_A=KEYWORD1"
set "REPLACE_A=REPLACED1"
set "SEARCH_B=KEYWORD2"
set "REPLACE_B=REPLACED2"
set "newfile=Output.txt"

for /r %%i in (*.txt) do (

echo %%~nxi>> search_result.txt 

set "textfile=%%~nxi"
set "newfile=Output.txt"

(for /f "delims=" %%j in (!textfile!) do (
    set "line=%%j"
    setlocal enabledelayedexpansion
    set "line=!line:%SEARCH_A%=%REPLACE_A%!"
    set "line=!line:%SEARCH_B%=%REPLACE_B%!"
    echo(!line!
    endlocal
))>"%newfile%"

del !textfile!

rename %newfile%  !textfile!  

set /a counter=!counter!+1    


)

endlocal

而且它确实有效。我有两个问题:

  • 关键字替换不适用于名称中有两个单词且中间有空格的 TXT 文件。有什么办法可以解决吗?
  • 它还会检查目录中比 .bat 文件级别低的文件。如何限制它只检查与 .bat 相同级别的文件?

请帮助我。顺便说一句,我是个菜鸟。

【问题讨论】:

    标签: windows file batch-file text replace


    【解决方案1】:

    将所有(可能)包含空格的文件/文件夹名括在引号中(更好:习惯于将所有文件/文件夹名括在引号中):

    (for /f "usebackq delims=" %%j in ("!textfile!") do (
    

    (需要usebackq 来实际处理文本文件,而不仅仅是它的名称字符串)

    del "!textfile!"
    rename "%newfile%"  "!textfile!" 
    

    for /r %%i in (*.txt) do (: /r 表示“递归”(包括子目录)。只需跳过 /r 即可仅处理当前文件夹而不处理子文件夹。

    【讨论】:

    • 哇!这样可行!非常感谢你!您能否也让我知道有什么区别,我们可以假设目录中只有一个 TXT 文件和 BAT 文件?但是文件名仍然未知,那么这个假设会简化代码吗?
    • 不,不是。您使用for %%I in (*.txt) 来获取所需的文件名。为简化起见,您可以使用%%~nxi 而不是!textfile!,但它的可读性较差。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多