このFORコマンドの出力に問題があります

このFORコマンドの出力に問題があります

レジストリキーの先頭でbatファイルを実行していることに気付きました。これにはecho running abc他の無関係なものもいくつか ありました。

HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun

そこで、私はその bat ファイルを変更しました。それは 1 行だけで、無関係なものは何もありません。

bat ファイルの内容が表示されます。

これは、現在の状況を示すコマンドプロンプトからの出力です。これは基本的に同じ問題ですが、問題を再現できるはずです。

問題は、

  • なぜ echo sss と表示され、 echo sss ttt と表示されないのですか?
  • FOR を使用して、cmd またはその初期化 bat ファイルの実行を抑制するにはどうすればよいですか? FOR ステートメントでは、実際には「echo sss」や「echo sss ttt」ではなく、「echo g」のみが表示される必要があります。

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.
sss ttt
C:\Documents and Settings\Administrator>cd\

C:\>type \blah\startfile.bat <ENTER>
@echo sss ttt   

C:\>  

C:\>for /f %f in ('echo g ^| findstr "g"') do echo %f <ENTER>

C:\>echo sss
sss

C:\>echo g
g

C:\>

答え1

なぜ echo sss と表示され、 echo sss ttt と表示されないのですか?

行にsss tttスペース文字が含まれているため、forコマンドはそれをトークン化し、前半sssを に%f、後半を変数tttに格納します%g

FOR を使用して、cmd またはその初期化 bat ファイルの実行を抑制するにはどうすればよいですか? FOR ステートメントでは、実際には「echo sss」や「echo sss ttt」ではなく、「echo g」のみが表示される必要があります。

echo g ^| findstr "g"新しいコマンドを評価するために、インタープリタが初期化され、\blah\startfile.bat自動的に実行されるようです。バッチが何も出力しないようにします。

答え2

%fバッチファイル内で使用する場合は、別のエスケープ文字を使用する必要があります%

for /f %%f in ('echo g ^| findstr "g"') do echo %%f

これをバッチファイルに入れると、必要な結果が得られるはずです。

答え3

Vlastimil さんの回答を少し詳しく説明します...

ときFORコマンドは"echo g"出力をパイプでfindstrのためにまず新しいコマンドプロセッサを起動する必要があり、\blah\startfile.bat実行される。

\blah\スタートファイル.batを含む行を出力しますsss tttその行は、のためにそしてない渡される検索文字列

ヘルプによるとのために:

処理は...で構成され、テキストを個々の行に分割し、各行を 0 個以上のトークンに解析します。次に、見つかったトークン文字列に設定された変数値を使用して、for ループの本体が呼び出されます。デフォルトでは、/F は各行から最初の空白で区切られたトークンを渡します...

デフォルトの区切り文字はのためには:"、;"(スペース、カンマ、セミコロン)。

最初の行はのためにプロセスには次の文字列が含まれます:さあさあさあ. その文字列には" "(スペース)は、のために行を解析し、最初のトークン文字列を割り当てます。「しっ」"%f"。だから「%f をエコー」以下の行のみを出力します:「しっ」これが印刷された最初の行です。「っ」単に破棄されるのは、「FOR ... エコー %f」コマンドでは、最初のトークン以外のものを含めるように指定されていません。

もし、のためにコマンドの書き方が違っていたら、完全な行が表示されるはずです「しっ、しっ」反響した。

ここでは3つの方法を紹介しますのためにそれを実行するためのコマンドが記述されている可能性があります。

最初の方法は、"delims="オプションは、のために「空」にするためにのために行全体を1つのトークンとして返します。トークンは解析され、すべての区切り文字("、;")が削除され、すべてのトークンが各トークンの間にスペースを入れて再び結合されます。この結合された値は変数に返されます。"%f"

C:\>for /f "delims=" %f in ('echo sss ttt')  do echo %f

C:\>echo sss ttt
sss ttt

C:\>for /f "delims=" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f

C:\>echo mm nn oo ss tt
mm nn oo ss tt

次の方法は、"tokens=*"オプション、伝えるのために見つかったトークンをすべて指定された変数の値に格納します("%f")。トークンは解析され、すべての区切り文字が削除され、その後、すべてのトークンが各トークンの間にスペースを入れて再度結合されます。

C:\>for /f "tokens=*" %f in ('echo sss ttt')  do echo %f

C:\>echo sss ttt
sss ttt

C:\>for /f "tokens=*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo %f

C:\Users\1-kevin>echo mm nn oo ss tt
mm nn oo ss tt

この3番目の方法は、"tokens=1,*"オプション、伝えるのために見つかった最初の(1)トークンを指定された変数の値に格納する("%f"そして、残りのトークンが解析され、すべての区切り文字が削除され、残りのトークンはすべて各トークンの間にスペースを入れて再び結合され、この結合された値が指定された変数名の後に続く文字で名前が付けられた変数に返されます(この場合、変数「%g」)。

C:\>for /f "tokens=1,*" %f in ('echo sss ttt')  do echo %f %g

C:\>echo sss ttt
sss ttt

C:\>for /f "tokens=1,*" %f in ('echo mm;nn,oo, ;ss ,, tt') do echo "%f" "%g"

C:\>echo "mm" "nn oo ss tt"
"mm" "nn oo ss tt"

指定された変数を超える変数には「トークン=」が定義されていないため、次のコードは機能しないことに注意してください。"%f":

C:\>for /f %f in ('echo sss ttt')  do echo %f %g

C:\>echo sss %g
sss %g


つまり、あなたの例では、"delims="オプションを選択すると、次のように表示されます。

C:\>for /f "delims=" %f in ('echo g ^| findstr "g"') do echo %f

C:\>echo sss ttt
sss ttt

C:\>echo g
g

C:\>

関連情報