web-dev-qa-db-ja.com

findstrの入力へのパイピング

マクロ名のリスト(1行に1つ)を含むテキストファイルがあります。私の最終的な目標は、現在のディレクトリのファイルにマクロの名前が何回表示されるかを印刷することです。

マクロの名前はC:\temp\macros.txtにあります。

コマンドプロンプトのtype C:\temp\macros.txtは、リストを正常に出力します。

次に、その出力をfindstrの標準入力にパイプします。

type C:\temp\macros.txt | findstr *.ss(ssは、マクロ名を探しているファイルタイプです)。

これは機能していないようです。結果は得られません(非常に高速で、まったく試行されていないようです)。 findstr <the first row of the macro list> *.ssは機能します。

findstr *.ss < c:\temp\macros.txtも試しましたが成功しませんでした。

15
Gauthier

findstrがどのように機能するか少し混乱していると思います。ファイル名(パターン)またはstdinから入力(検索するものではなく、検索するもの)を取得しますが、検索するものは常にコマンドラインで指定されますfindstrへの引数として。

findstr foo xyz.txt

ファイルxyz.txtで文字列fooを検索します。

type meh.txt | findstr x

前のコマンドの出力で文字列xを見つけます(この場合、ファイルmeh.txtの内容– typeコマンドの無駄で、よくある誤用によく似ています。 cat)。

マクロ名が表示される実際の行の代わりにcountsを使用しているので、別のアプローチをお勧めします。これは、マクロを含むファイルに1行に1つずつリストされていることを前提としています。

for /f "delims=" %x in (macros.txt) do @(echo %x: & find /c "%x" *.ss)

forループは、ファイルの内容を行ごとに繰り返し処理します。次に、検索している名前を出力し、実際に一致する行をカウントするfind /cを実行します。

17
Joey