すでにDIRコマンドの出力をキャプチャするためにFOR/Fを使用しました。 FINDSTRの出力をキャプチャすることも同じです。
ただし、DIRコマンドでFOR/Fの代わりに単純なFORを使用する方が効率的です。
あなたが%%~fg
と思ったら、%~f1
を使用しました。
%var%を使用してカッコ内の変数セットを展開することはできません。!var!代わりに遅延拡張。詳細については、コマンドラインからSET /?
を入力 - で始まるセクションを読んで、「最後に、遅延環境変数の展開のサポートが が追加されました...」
をしかし、あなたのケースでは、あなたが簡単に遅れての使用を避けることができます拡張(それは問題ではない)。
既存の "fullnames.txt"を削除して出力を追加する代わりに、全体の構造をかっこで囲み、すべての出力を上書きモードでファイルにリダイレクトする方が効率的です。
@echo off
(
for %%F in (*.eml) do (
for "delims=" %%A in ('findstr /b /c:"To: " "%%F"') do echo %%F %%A
)
) >fullnames.txt
しかし、上記の解決策は、そのままでは、必要以上に複雑です。
FINDSTRは、ワイルドカードで指定された複数のファイルを処理でき、各一致する行の先頭にファイル名とコロンを付けます。
あなたも、バッチファイルを使用せずに、単純にコマンドラインからあなたの結果を得ることができます(またはバッチファイルでこれを置くことができる):
findstr /b /c:"To: " *.eml >fullnames.txt
編集
あなたが懸念されている場合は、そのファイルには、複数の行が「TO:」で始まる含まれている可能性があり、そしてあなただけのそれはバッチファイルを使用するように戻って、最初の行を使用したい:
@echo off
setlocal enableDelayedExpansion
set "prevFile="
(
for /f "tokens=1* delims=:" %%A in ('findstr /b /c:"To: " *.eml') do (
if "%%A" neq "!prevFile!" echo %%A: %%B
set "prevFile=%%A"
)
) >fullnames.txt
上記の溶液でしFファイル名に!
が含まれている場合は不要です。また、パスにドライブ文字が含まれていない限り、パスは*.eml
で使用できます。ドライブと!
の両方の問題は、追加の変更で解決できます。
をしかし '設定toline = FINDSTR/B/C「:を」' '_実行_ありませんFINDSTR'コマンドを実行すると、テキストのみが割り当てられます – jeb