2012-10-26 70 views
0

我有要求生成一个简单的.BAT脚本/文件。我认为它是容易的,但我自己错了:-(CMD/BATCH编程 - 文件内容搜索和文件内容修改

的BAT脚本有(我相信):

  1. 取一个const搜索字符串搜索
  2. 以绝对的文件夹路径“开始”目录
  3. 取一个文件名面膜/正则表达式搜索
  4. 以一个常量字符串被“附加”的文件的内容
  5. 递归遍历所有文件迭代的启动目录和子目录(n级下)搜索(和“处理”)任何与文件名掩码/正则表达式匹配的文件
  6. 搜索“当前”文件的内容(全部“是可以在NOTEPAD中打开的文本”文件),搜索字符串。搜索字符串可以在文件中的任何位置找到0,1或多次。
  7. 如果发现searchstring,则什么也不做。如果未找到搜索字符串,请将新字符串附加到文件末尾。瞧! (理论上)

继承人我已经,并没有真正的工作。我可以看到几个问题。如何获得“当前文件”,也可能如何在每个文件后“重置”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% 
      ) 

任何问题/建议,非常欢迎

干杯

凯尔

+0

为候选单独的文件,然后又访问您可以使用FOR循环的FINDSTR的结果看结果,或FINDSTR结果重定向到一个文件,然后解析,请参见http:// stackoverflow.com/questions/8942211/extract-found-line-subsequent-line-from-a-text-file的想法 –

回答

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%"时,如果搜索字符串还包含引号可能会导致问题可能会导致问题。

  • FINDSTR在文字搜索字符串内有\"字符的尴尬转义规则。

  • 如果搜索字符串具有一定的字节码> 128

更多信息,请参见What are the undocumented features and limitations of the Windows FINDSTR command?有关使用FINDSTR

最简单的方法来使代码工作的复杂性

  • FINDSTR可能无法正常工作所有情况都是使用延迟扩展来避免变量值中的有毒字符出现问题,并将搜索字符串存储在临时文件中,并使用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"