2016-10-14 3 views
2
for /f %%a in ('type "file.txt"^|find "" /v /c') do set /a count=%%a 

私はここhttp://www.dostips.com/?t=Snippets.CountLinesテキストファイルの行数をカウントするこのバッチコマンドはなぜ機能しますか?

を、このコマンドを見つけた動作しているようですが、私は理由を理解することはできません。私は、特殊文字などのバグがない限り、私が理解できないものを使用することを嫌っていますが、なぜそれが機能するのか理解できません。

+0

'find /?'コマンドプロンプトから'/v'と '/ c'スイッチが何を行うのかを読んでください。 –

+0

バッチはどれくらい使い慣れていますか? 'for/f'ループが何をしているのか説明しなくても、答えは小さくなります。 – SomethingDark

+0

コマンドを巻き戻します。 'type" c:\ windows \ win.ini "| find" "/ v/c' –

答えて

6

インサイドアウト

  • type file.txtは、単に標準出力に出力ファイルとその内容を読み取ります。

  • このコードでは、typeコマンドの出力はfindコマンドにパイプされています。

  • findコマンドは(空の文字列が表示されている場合findは何も一致しません)(/v)何も含まれていません行を探し、その標準入力(読むために何のファイルが示されていない)やフィルタ、それを読み込みます。フィルタリング中に見つかった行数を数え、一致する行数(/c)のみを標準ストリームに出力します。空の文字列は何も一致しませんが、/vスイッチがそれを否定するので、ファイル内のすべての行のマッチング(およびカウント)を終了します。

  • 以前の2つのパイプコマンドは、for /fコマンドを使用して実行されます。 for /fは、文字列を処理したり、ファイルの内容を読み込んだり、コマンドを実行したり、その出力を処理するために使用されます。

ノート:パイプは特別な文字であり、内部にそれを含める:デフォルトで実行されるコマンドがfor /fコマンド

ノートin句で単一引用符で囲まれています我々はそれをエスケープする必要がありfor /fコマンド(^|)各リットルに対して

  • (文字列、ファイル内の各行、またはコマンド出力の各行)do句内のコードが実行され、for置換可能なパラメータ(%%a)に格納されている行が処理されますこのコード)

  • findコマンド(ファイル内の行の数の出力)do句が実行され、for /f交換可能なパラメータに格納され、交換可能なパラメータに格納されたファイル内の行の数( )を環境変数にコピーする

set /aは算術演算に使用されます。この場合には必要ではなく、単純なsetコマンドで作業する必要がありますが、環境変数に格納される値が数値であることを明確にするために、このように書かれているかもしれません。

+0

* "それがもっと分かりやすくするためにこのように書かれたのかもしれません" * - そうです。何らかの理由で出力が数値でない場合は、数値(0)にしてください。 – GolezTrol

+2

@GolezTrol、環境変数は常に文字列ですが、 '/ a'は演算コードを処理するために別のパーサーを呼び出すだけです。私はまだ 'find/c'コマンドの出力に数字が何も表示されていないのを見たことがあります。 –

+0

はい、環境変数は常に文字列ですが、 'set/a var = XYZ'はvarが' 0'になります。したがって、ここで '/ a'を型キャストのように使用すると、varに次のステップを破る可能性のあるテキスト値 'XYZ'の代わりに'数値 '(有効な数値を含む文字列)が含まれることが保証されます。それは、セーフガードとして、または次のステップで結果を簡単に確認する方法として使用できます。通常はうまくいくはずですが、 'find'がエラー(ファイルが読めない、ネットワークのタイムアウトなど)が発生した場合に何かを返すかもしれません。 – GolezTrol

関連する問題