web-dev-qa-db-ja.com

(.bat)コードの括弧で囲まれたブロック内のFINDSTRにパイプするときに、このあいまいな色のバグを軽減するためのより良い方法はありますか?

次の.BATファイルでは、テスト2は括弧で囲まれたコードブロック内の色のバグを示し、テスト3はFORループ内のバグを示し、テスト4は何もしないサブルーチンを呼び出すことによってバグを軽減する方法を示しています(call:resetANSI)。私の質問は次のとおりです。

  1. バグの性質は何ですか...なぜ括弧で囲まれたコードブロック内のFINDSTRにパイプした後、インラインカラーコードが失敗するのですか?このバグはFINDSTRに固有ですか、それともより一般的ですか? (FINDSTRにはいくつかの既知のバグがありますが、その中にこれがリストされていませんでした。)

  2. このバグを軽減するための最良の方法は、何もしないサブルーチンを呼び出すことですか?

コードの下には、表示出力のスクリーンキャプチャがあります。これは、マゼンタで表示されるはずの行のテスト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

Screen capture of output of .BAT program

4
Dolores Stevens

ユーザー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.

Display output of the .bat code

2
Dolores Stevens