CMD / BATCH编程 - 文件内容搜索和文件内容修改

时间:2012-10-26 08:25:59

标签: batch-file cmd

我需要生成一个简单的.BAT脚本/文件。我认为这很容易,但我有多么错: - (

BAT脚本必须(我相信):

  1. 使用const搜索字符串搜索
  2. 将绝对文件夹路径设为“开始”目录
  3. 使用文件名掩码/正则表达式搜索
  4. 将const字符串“附加”到文件内容
  5. 递归遍历开始目录和子目录中的所有文件(n级向下)搜索(和“处理”)与文件名掩码/正则表达式匹配的任何文件
  6. 搜索searchstring的“当前”文件的内容(所有“可以在NOTEPAD中打开的文本”文件)。搜索字符串可以在文件中的任何位置找到0,1或多次。
  7. 如果找到searchstring,则不执行任何操作。如果未找到searchstring,则将新字符串附加到文件末尾。瞧! (理论上)
  8. 这是我已经拥有的,而不是真正的工作。我有几个问题我可以看到。如何获取“当前文件”以及可能还有如何在每个文件后“重置”ERRORLEVEL。

    SET SEARCHSTRING="search for this text"
    SET STARTPATH="C:\StartFolder\*"
    SET MATCHFILES="*.txt"
    SET APPENDSTRING="Appended text"
    findstr /c:%SEARCHSTRING% /b /i /d:%STARTPATH% %MATCHFILES%
    SET FOUND=%ERRORLEVEL%
    REM 0=true, 1=false
    IF %FOUND%==1 (
                    REM ISSUE: How to get "current" file path???
                    REM %APPENDSTRING% >> %CURRENTFILEPATH%
                  )
    

    任何问题/建议超过欢迎

    干杯

    凯尔

1 个答案:

答案 0 :(得分:0)

我通常不希望在变量值中包含引号。然后,我在扩展时根据需要添加封闭引号。而不是set var="value",我喜欢使用set "var=value"。如果我稍后需要附上引号,那么我使用"%var%"

注意:我的下面的代码都没有经过测试。可能会有一些愚蠢的错误,但我相信整体概念是合理的

以下简单脚本应该处理大多数情况。使用/M选项,以便FINDSTR不会浪费时间搜索每一行的多个 - 它会在找到匹配的单行后立即退出。

@echo off
setlocal
set "SEARCHSTRING=search for this text"
set "STARTPATH=C:\StartFolder"
set "MATCHFILES=*.txt"
set "APPENDSTRING=Appended text"
for /r "%STARTPATH%" %%F in ("%MATCHFILES%") do (
  >nul findstr /mbic:"%SEARCHSTRING%" "%%~F" || >>"%%F" echo(%APPENDSTRING%
)

但是有很多场景可能会破坏上述代码。

  • 在展开&

  • 时,不加引号|%APPENDSTR%等毒药字符可能会导致问题
  • 如果SEARCHSTRING还包含引号,则在展开"%SEARCHSTRING%"时,毒药字符可能会导致问题。

  • FINDSTR对文字搜索字符串中的\"个字符设置了尴尬的转义规则。

  • 如果SEARCHSTRING具有某些字节代码,则FINDSTR可能无法正常工作。 128。

有关使用FINDSTR的复杂性的更多信息,请参阅What are the undocumented features and limitations of the Windows FINDSTR command?

使代码在所有情况下都能正常工作的最简单方法是使用延迟扩展来避免变量值中的有毒字符出现问题,并将搜索字符串存储在临时文件中并使用FINDSTR /G选项。搜索字符串中的任何\字符都必须转义为\\。必须在FOR循环中禁用延迟扩展,以便包含!的文件名不会损坏。

@echo off
setlocal disableDelayedExpansion
set "SEARCHSTRING=search for this text"
set "STARTPATH=C:\StartFolder"
set "MATCHFILES=*.txt"
set "APPENDSTRING=Appended text"

set "tempFile=%temp%\search%random%_"
setlocal enableDelayedExpansion
>"%tempFile%search.txt" echo(!SEARCHSTRING:\=\\!
>"%tempFile%append.txt" echo(!APPENDSTRING!
endlocal

for /r "%STARTPATH%" %%F in ("%MATCHFILES%") do (
  >nul findstr /mbig:"%tempFile%search.txt" "%%~F" || type "%tempFile%append.txt" >>"%%~F"
)

del "%tempFile%*.txt"