0

シンプルな .BAT スクリプト/ファイルを生成する必要があります。私はそれが簡単だと思っていましたが、私はどれほど間違っていました:-(

BATスクリプトは(私は信じています):

  1. const 検索文字列を取得して検索する
  2. 「開始」ディレクトリへの絶対フォルダーパスを取得します
  3. 検索するファイル名マスク/正規表現を取得します
  4. ファイルのコンテンツに「追加」される定数文字列を取得します
  5. 開始ディレクトリとサブディレクトリ (n レベル下) のすべてのファイルを再帰的に繰り返し、ファイル名マスク/正規表現に一致するファイルを検索 (および「処理」) します。
  6. 検索文字列について、「現在の」ファイル (メモ帳で開くことができるすべての「テキスト」ファイル) の内容を検索します。検索文字列は、ファイル内のどこにでも 0 回、1 回、または何度も見つかります。
  7. 検索文字列が見つかった場合は、何もしません。検索文字列が見つからない場合は、新しい文字列をファイルの末尾に追加します。出来上がり!(理論的には)

Heresは私がすでに持っているもので、実際には機能していません。私が見ることができるいくつかの問題があります。「現在のファイル」を取得する方法と、各ファイルの後に 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%
              )

ご質問やご提案は大歓迎です

乾杯

カイル

4

1 に答える 1

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%
)

しかし、上記のコードを壊す可能性のある多くのシナリオがあります。

  • unquoted などの有毒文字は&|展開時に問題を引き起こす可能性があります%APPENDSTR%

  • "%SEARCHSTRING%"SEARCHSTRING に引用符が含まれている場合、展開時に有害な文字が問題を引き起こす可能性があります。

  • FINDSTR には、リテラル検索文字列内の\および文字に対する厄介なエスケープ規則があります。"

  • SEARCHSTRING に 128 を超える特定のバイト コードがある場合、FINDSTR は正しく機能しない可能性があります。

Windows 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"
于 2012-10-26T16:51:44.757 に答える