2012-10-26 72 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"