例:Set var=findstr "name" temp.txt [temp.txt consist multiple lines , out of which one line says "my name is ABC"]
後で行の最後の単語、つまりABCを見つけます
2 に答える
コマンドの出力をキャプチャするには、for /f
ループを使用します。詳細については、を参照help for
してください。
演習 1
の値%var%
を の出力に設定するには、次のfindstr
ようにします。
for /f "delims=" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%I"
次に、行の最後の単語が必要な場合は、基本的なfor
ループを使用して の各単語をループできます%var%
。
for %%I in (%var%) do set "lastword=%%I"
set "var=%lastword%"
演習 2
あるいは、「name」を含む行が常に 4 トークンの長さになることがわかっている場合 (「My name is blah」のように)、次のfindstr
ように出力の 4 番目のトークンを単純にキャプチャできます。
for /f "tokens=4" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%I"
以上です。 %var%
には、 に一致した行の 4 番目の単語が含まれfindstr
ます。
演習 3
行が常に「私の名前は」で始まることがわかっているが、姓と名、または「ジョン・ジェイコブ・ジングルハイマー・シュミット」のような多くの名前の可能性が必要な場合は、次のようtokens
に必要なものをキャプチャするために使用できます演習 2。
for /f "tokens=3*" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%J"
今回%%J
の代わりにキャプチャしたことに注意してください。%%I
これ%%I
は、トークン 3 (3 番目の単語) であり、while%%J
はそれ以降のすべて ( のワイルドカードtokens=3*
) であるためです。
演習 4
または、名前が姓名である可能性があるが、その前に「My name is」が付くことがわかっている場合は、可変部分文字列置換を使用して「My name is」の部分を削除できます。
for /f "delims=" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%I"
set "var=%var:My name is =%"
これにより、 の値から「私の名前は」が取り除かれ、%var%
「John Smith」が残ります。
演習 5
「name」を含む行が同じ数の単語であると数えられない場合 (たとえば、「Hi there! My name is」または「Hello! My name is」)、可変部分文字列置換とワイルドカードを使用できます。これは、名前が 1 語以上であるかどうか、および「name is」の前の内容が異なるかどうかに関係なく機能するはずです。
for /f "delims=" %%I in ('findstr /i "name" "temp.txt"') do set "var=%%I"
set "var=%var:*name is =%"
他のプログラミング言語と同様に、バッチでも変数をメモリに保存して、さらに使用することができます。
@echo off&setlocal
set "file=temp.txt"
set "search=name"
:: clear the local environment
for /f "delims==" %%i in ('set $ 2^>nul') do set "%%i="
:: find the lines containing %search%
for /f "delims=" %%i in ('findstr "%search%" "%file%"') do set "$%%i=%%i"
:: show the line variables
set $