私はstdinから読み込んで、処理されたバージョンをstdoutに出力する実行可能ファイル、例えばprocess.exeを持っています。私が作成したいのは、stdinの一部だけが処理されるように、代わりに呼び出すことができるバッチファイルラッパーです。具体的には、あるキーワードの後の部分が検出される。Windowsのバッチファイルで、キーワードの周りにstdinを分割し、別のプログラムに半分を渡す方法は?
たとえば、process.exeは、与えられた行と同じ行を出力し、最後にスターが追加されたとします。 (それはもちろんはるかに複雑ですが、ちょうど一例として。)だから私は、次の入力でそれを実行した場合:
apple
banana
cantaloupe
date
私は私が何をしたいのか
apple*
banana*
cantaloupe*
date*
を取得することは作成されますバッチファイルを使用して、私の特別なキーワードを含む行の後に出現する行だけが処理されるようにします。キーワードがあるのであれば、「キーワード」と、私の入力は次のとおりです。
apple
banana
keyword
cantaloupe
date
は私がキーワードの前のラインがまだstdoutに出力していること
apple
banana
keyword
cantaloupe*
date*
注意したい、彼らはプロセスに渡されていません。 EXE。どうすればこれを達成できますか?理想的には、私はディスクへの書き込みを避けたいと思います。なぜなら、私が供給する入力は非常に大きくなる可能性があるからです。さて、私はfor /F "tokens=*" %%a in ('findstr /n $') do (
をstdin行ごとにループすることができますが、findstrは入力全体を消費するので、私はそれをprocess.exeに渡すことはできないようです...
Windowsバッチファイルでは不可能なことですが、Powershellはどうですか?
"findstrは入力全体を消費するので、process.exeにはそのどれも渡せません。*" - ここにはないようです - https://stackoverflow.com/a/6980605/478656。はい、powershellでは可能です。 '$ words | foreach-object -begin {$ KeywordSeen = $ false} - プロセス{if(-not $ keywordSeen){$ _} else {$ _ | process.exe}; if($ _ -eq 'keyword'){$ KeywordSeen = $ true}} 'などとなります。 – TessellatingHeckler
これまでに何を試しましたか、どの部分に問題がありますか? – aschipfl
PowerShellでは、ソースをhere-stringとして読み込み、キーワードで分割し、最初の部分をstdoutに渡し、2番目の部分を新しい行に分割してprocess.exeに渡すことができます。 '$ fileInput =(get-content $ filepath -raw)-split $ keyword; $ fileInput [0]; $ fileInput [1] -split '[\ r \ n] +' | Process.exe' – TheMadTechnician