スクリプトには重い論理エラーはありません。私は、新しいコマンドプロンプト(cmd
)インスタンスを開始するので、予期しない動作を引き起こすのがパイプ|
であると思われます。左端が特別な意味を持つ文字を含む既に展開された文字列(echo %%A
)を受け取ります。 cmd
。ここで
は、スクリプトの可能な改善である - すべての説明の発言(rem
)を参照してください。
@echo off
setlocal DisableDelayedExpansion
rem // Define constants here:
set "targetFolder=C:\Utilisateurs\wlp-cas-provider"
set "fileMask=*.java"
set "outputFile=C:\Utilisateurs\a669884\Documents\script22.txt"
set "_strInsert=import java.interceptor.ReportInterceptor;"
set "_strFind=import javax.interceptor.Interceptors;"
rem // Enumerate all matching files:
for %%I in ("%targetFolder%\%fileMask%") do (
rem /* Redirect the output of the whole `for /F` loop at once;
rem this improves the performance, and there is no appending `>>`,
rem so it does not matter whether the file already exists before: */
> "%outputFile%" (
rem /* Use `findstr /N` to precede every line by its line number
rem and a colon, so no line appears empty to `for /F` any more;
rem remember that `for /F` ignores empty lines otherwise: */
for /F "delims=" %%A in ('findstr /N "^" "%%~I"') do (
rem // Store the current line string with line number prefix:
set "line=%%A"
rem // Toggle delayed expansion to maintain exclamation marks:
setlocal EnableDelayedExpansion
rem // Remove the line number prefix and the colon:
set "line=!line:*:=!"
rem // Return the original line unconditionally:
echo(!line!
rem /* Explicitly initiate another child `cmd` instance on the
rem left side of the pipe with delayed expansion enabled;
rem escape the delayed expansion like `^^!` not to be
rem processed by the parent `cmd` instance, so the child
rem `cmd` instance receives the variable `!line!` only;
rem therefore strings potentially containing special
rem characters are expanded at the very latest point: */
(cmd /V /C echo(^^!line^^!| find "!_strFind!" > nul) && (
rem /* The string to search has been found, so return the
rem string to insert after it at this point: */
echo(!_strInsert!
)
endlocal
)
)
rem // Move the result file over the currently iterated one:
move /Y "%outputFile%" "%%~I" > nul
)
endlocal
exit /B
これは、文字通りすべての文字が検索文字列に表示されることを可能にします。 find
で正しく処理するには、引用符"
を倍にする必要があることに注意してください。行全体が検索文字列と一致するようにするには、find
コマンド行をfindstr /X /C:"!_strFind!"
に置き換えます。この場合、検索文字列に引用符が含まれている場合は、\"
のようにエスケープします。リテラルバックスラッシュは\\
のように2倍にする必要があります。大文字小文字を区別しない検索を行う場合は、/I
オプションをfind
またはfindstr
に追加します。
あなたは...パイプを含むブロックを回避できます。
(cmd /V /C echo(^^!line^^!| find "!_strFind!" > nul) && (
echo(!_strInsert!
)
を...あなたは文字列を比較するif
ステートメントを使用する場合。例えば
ラインは、検索文字列を含むと予想される場合、代わりにこれを使用する:
if not "!line!"=="!line:*%_strFind%=!" echo(!_strInsert!
これは常にために使用sub-string replacementアプローチの大文字と小文字を区別しない検索を行います。検索文字列に次のいずれかの文字が含まれていると、このメソッドが失敗することがあります。^
,!
,%
,=
,。
行全体が代わりにこれを使用すると、検索文字列に一致することが期待されている場合:
if "!line!"=="!_strFind!" echo(!_strInsert!
あなたはif
ステートメントに/I
スイッチを追加しない限り、これは、大文字と小文字を区別した検索を行います。
あなたのコードは少し複雑ですが、ループが失敗する論理エラーは見つかりませんが、パイプが予期しない動作を引き起こしている可能性があります。とにかく、追加する前に一時ファイルを削除しておくべきですが、 'move'コマンドの後に削除する必要はありません。なぜなら、もはやそこには存在しないはずです... – aschipfl