次の.BATファイルでは、テスト2は括弧で囲まれたコードブロック内の色のバグを示し、テスト3はFORループ内のバグを示し、テスト4は何もしないサブルーチンを呼び出すことによってバグを軽減する方法を示しています(call:resetANSI)。私の質問は次のとおりです。
バグの性質は何ですか...なぜ括弧で囲まれたコードブロック内のFINDSTRにパイプした後、インラインカラーコードが失敗するのですか?このバグはFINDSTRに固有ですか、それともより一般的ですか? (FINDSTRにはいくつかの既知のバグがありますが、その中にこれがリストされていませんでした。)
このバグを軽減するための最良の方法は、何もしないサブルーチンを呼び出すことですか?
コードの下には、表示出力のスクリーンキャプチャがあります。これは、マゼンタで表示されるはずの行のテスト2と3でカラーコードが失敗したことを示しています。
助けようとする人に事前に感謝します!
[編集3/26/2020:フォーラムで.batコードのカラーコード定義にEsc文字が表示されなかったため、.batコードを編集してEsc文字を生成しました実行時。]
@echo off
goto :main
:resetANSI
EXIT /B
:main
setlocal EnableDelayedExpansion
for /F "delims=#" %%E in ('"Prompt #$E# & for %%E in (1) do rem"') do set "ESCchar=%%E"
set "green=%ESCchar%[92m"
set "yellow=%ESCchar%[93m"
set "Magenta=%ESCchar%[95m"
set "cyan=%ESCchar%[96m"
set "white=%ESCchar%[97m"
echo %white%Test 1 is NOT in a FOR loop nor within parentheses.
echo %yellow%[Test 1] %green%This is Green, %Magenta%this is Magenta, and %yellow%this is Yellow.
echo %Next, the string 'success' will be piped to FINDSTR...
echo success | findstr /R success
echo %Magenta%This is supposed to be Magenta, and FINDSTR found and displayed 'success'.%yellow%
echo %cyan%Test 1 completed.
echo %white%Test 2 is within parentheses.
( echo %yellow%[Test 2] %green%This is Green, %Magenta%this is Magenta, and %yellow%this is Yellow.
echo %Next, the string 'success' will be piped to FINDSTR...
echo success | findstr /R success
echo %Magenta%This is supposed to be Magenta, and FINDSTR found and displayed 'success'.%yellow%
)
echo %cyan%Test 2 completed.
echo %white%Test 3 is within a FOR loop.
for /L %%G in (3,1,3) do (
echo %yellow%[Test %%G] %green%This is Green, %Magenta%this is Magenta, and %yellow%this is Yellow.
echo %Next, the string 'success' will be piped to FINDSTR...
echo success | findstr /R success
echo %Magenta%This is supposed to be Magenta, and FINDSTR found and displayed 'success'.%yellow%
)
echo %cyan%Test 3 completed.%white%
echo %white%Test 4 is within a FOR loop and includes a call/return after the pipe to FINDSTR.
for /L %%G in (4,1,4) do (
echo %yellow%[Test %%G] %green%This is Green, %Magenta%this is Magenta, and %yellow%this is Yellow.
echo %Next, the string 'success' will be piped to FINDSTR...
echo success | findstr /R success
call :resetANSI
echo %Magenta%This is supposed to be Magenta, and FINDSTR found and displayed 'success'.%yellow%
)
echo %cyan%Test 4 completed.%white%
exit /B
ユーザーvssherによる質問への回答の試みに基づいて(vssherは、正しく機能しないことが判明した後、彼/彼女の試みを削除しました)、最善の解決策を見つけたと思います。ネストされた括弧内にFINDSTRコマンドを配置します。このソリューションは、次の.batコードのテスト3および4で示され、表示出力のスクリーンキャプチャが.batコードの下に表示されます。
@echo off
setlocal EnableDelayedExpansion
rem Define some useful colorcode vars:
for /F "delims=#" %%E in ('"Prompt #$E# & for %%E in (1) do rem"') do set "ESCchar=%%E"
set "green=%ESCchar%[92m"
set "yellow=%ESCchar%[93m"
set "Magenta=%ESCchar%[95m"
set "cyan=%ESCchar%[96m"
set "white=%ESCchar%[97m"
set "black=%ESCchar%[30m"
echo %white%Test 1 is NOT in a FOR loop nor within parentheses, and color works right.
echo %yellow%[Test 1] %green%This is Green, %Magenta%this is Magenta, and %yellow%this is Yellow.
echo Next, the string 'success' will be piped to FINDSTR...%white%
echo success | findstr /R success
echo %Magenta%This is Magenta and FINDSTR found and displayed 'success' in white.%yellow%
echo %green%This is green.
echo %cyan%Test 1 completed.
echo:
echo %white%Test 2 is within parentheses, and color stops working after the pipe to FINDSTR.
( echo %yellow%[Test 2] %green%This is Green, %Magenta%this is Magenta, and %yellow%this is Yellow.
echo Next, the string 'success' will be piped to FINDSTR...%white%
echo success | findstr /R success
echo %Magenta%This is supposed to be Magenta and FINDSTR found and displayed 'success' in white.
echo %green%This is supposed to be green.
)
echo %cyan%Test 2 completed.
echo:
echo %white%Test 3 is within parentheses, but color works because FINDSTR is nested within parentheses.
( echo %yellow%[Test 3] %green%This is Green, %Magenta%this is Magenta, and %yellow%this is Yellow.
echo Next, the string 'success' will be piped to FINDSTR...%white%
echo success | ( findstr /R success )
echo %Magenta%This is Magenta and FINDSTR found and displayed 'success' in white.
echo %green%This is green.
)
echo %cyan%Test 3 completed.
echo:
echo %white%Test 4 is within parentheses, FINDSTR is nested within parentheses,
echo and FINDSTR is piped a string that does NOT match what it's searching for.
( echo %yellow%[Test 4] %green%This is Green, %Magenta%this is Magenta, and %yellow%this is Yellow.
echo Next, the string 'failed' will be piped to FINDSTR...%white%
echo failed | ( findstr /R success )
echo %Magenta%This is Magenta and FINDSTR correctly displayed nothing.
echo %green%This is green.
)
echo %cyan%Test 4 completed.