2017-05-31 4 views
1

私は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はどうですか?

+1

"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

+1

これまでに何を試しましたか、どの部分に問題がありますか? – aschipfl

+1

PowerShellでは、ソースをhere-stringとして読み込み、キーワードで分割し、最初の部分をstdoutに渡し、2番目の部分を新しい行に分割してprocess.exeに渡すことができます。 '$ fileInput =(get-content $ filepath -raw)-split $ keyword; $ fileInput [0]; $ fileInput [1] -split '[\ r \ n] +' | Process.exe' – TheMadTechnician

答えて

1
@echo off 
setlocal 
set "process=" 
(
for /f "delims=" %%a in (filename) do (
if "%%a"=="keyword" set "process=Y" 
if defined process (process %%a) else (echo %%a) 
) 
)>outputfilename 
goto :eof 

当然のことながら、あなたは、キーワード検出の場合、不感性が必要な場合は、コマンドライン上の入力に%~1にキーワードをkeywordを変えることができるに/iを追加することができます。あなたがいないprocess

keywordを送るしたいバッチファイルprocess.batを呼び出さない場合if sのオーダーを切り替えます。

関連する問題