• 締切済み

C# Process.Start で標準入力

はじめまして。 現在、C#で以下のような仕様のEXEをProcess.Startで起動し、ReadToEndで 結果を受け取りたいのですが、できません。 EXEの仕様: DOSプロンプトから以下のように起動します。 ■ xxx.exe < yyy.txt (yyy.txtを解析してDOSプロンプトに結果が出力されるプログラムです) 単に、xxx.exe yyy.txtと実行したのではエラーになるプログラムです。 期待する動き: ■ readToEndに出力ないようが表示される たとえばnotepad.exeのようなプログラムの際には、 Process.Start("notepad.exe", "open.txt"); とすればopen.txtがメモ帳で開かれますが、 今回質問させていただいた関数のように リダイレクト"<"が必要なプログラムで どう実装すれば、Process.Startで正常に動作してくれますでしょうか? よろしくお願いします。

みんなの回答

回答No.2

MSDNに書いてある落とし穴にはまっていますね。 WaitForExitメソッドは,ReadToEndの後に呼び出す必要があります。

回答No.1

Processクラスのインスタンスを作成し必要なプロパティの設定を行ってから, インスタンス用のStartメソッドを呼び出す必要があります。 標準入出力のリダイレクトについては,それぞれMSDNにサンプルがあるので参考になるかと思います。 MSDN: Process.StandardError プロパティ (System.Diagnostics) http://msdn.microsoft.com/ja-jp/library/system.diagnostics.process.standarderror.aspx MSDN: Process.StandardInput プロパティ (System.Diagnostics) http://msdn.microsoft.com/ja-jp/library/system.diagnostics.process.standardinput.aspx MSDN: Process.StandardOutput プロパティ (System.Diagnostics) http://msdn.microsoft.com/ja-jp/library/system.diagnostics.process.standardoutput.aspx

yuzuhiko2010
質問者

補足

回答ありがとございます。 質問の仕方が不足していました。 以下のように実装していますが、 string param = " < " + xxx.txt; System.Diagnostics.Process p2 = new System.Diagnostics.Process(); p2.StartInfo.FileName = "C:\\test\\sample.exe"; p2.StartInfo.Arguments = param; p2.StartInfo.UseShellExecute = false; p2.StartInfo.RedirectStandardInput = true; p2.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal; p2.StartInfo.RedirectStandardOutput = true; p2.Start(); p2.WaitForExit(); string xxx = p2.StandardOutput.ReadLine(); xxxに期待する文字列が入らないです。 パラメータに指定している"<"が怪しい気がするのですが・・

関連するQ&A

  • C# Process.Startメソッドで複数引数を渡したい

    タイトルの通り、Process.Startメソッドで起動するアプリに複数2つ以上の引数を渡し、実行させたいのですが、方法がわかりません。 以下、サンプル1のように引数が1つならいいのですが、 サンプル2のように2つ以上の引数の場合、どうしたらよいでしょうか?ご存知の方、ご教授お願いいたします。 [サンプル1] Process.start(abc.exe, "c:\abc.txt") [サンプル2] Process.start(abc.exe, "c:\abc.txt", "c:\def.txt")

  • VBAのShellの同期的実行

    ExcelVBAについての質問です。コマンドプロンプトで実行するプログラムをCで作成しました(これをXXX.exeとします)。このプログラムは計算が終了した後で、その結果のファイルを作成します(これをYYY.txtとします)。このプログラムを操作し、結果を表にして出力するために、ExcelVBAでshellを使って以下のようなプログラムを作成しました。   shell("XXX.exe")   call Output Outputでは、XXX.exeが作成したファイルYYY.txtからデータを読み込んでシートに結果を出力するのですが、うまくファイルを読み込みません。多分、shellにより実行したXXX.exeが終了する前にOutputが呼ばれているのだと思うのですが、もしそうだとしたらどのような解決方法があるのでしょうか。よろしくお願いします。 WinXp、Excel2000です

  • コマンドプロンプトを表示せずにプロセスの起動

    VB.NETでソースファイルをJ2sk142(javac.exe)に渡してコンパイルの結果をコマンドプロンプトではなくVBのTextBoxに表示するプログラムを作成しています。 でも、プロセスを起動すると一瞬だけプロンプトが表示されます。 これを表示させない方法はありますでしょうか? With Process1 .StartInfo.FileName=JAVACPATH .StartInfo.Arguments=TextBox.Text .StartInfo.WorkingDirectory=ProPath .StartInfo.UseShellExecute = False .StartInfo.ErrorDialog = True .EnableRaisingEvents = True .StartInfo.RedirectStandardOutput = True .StartInfo.RedirectStandardError = True .StartInfo.WindowStyle = ProcessWindowStyle.Hidden End With Try Process1.Start() OutPutTextBox.Text &= Process1.StandardOutput.ReadToEnd OutPutTextBox.Text &= Process1.StandardError.ReadToEnd Process1.WaitForExit() Catch ex As Exception

  • NTプロセス一覧の取得

    毎々お世話になります。 NT4.0で稼働中のプロセス一覧をテキストファイルに出力したいと考えています。 Psapi.dllを使用すれば可能であるということは調べてわかったのですがNTのリソースキット等でEXE形式(DOSプロンプトより起動可能)で提供されてはいないのでしょうか? よろしくお願いいたします。

  • C# 他のアプリケーションを優先度「高」で起動したい

    例えば、notepadを起動したいなら、以下のようにやればいいと思います。 System.Diagnostics.Process.Start("notepad.exe"); このnotepadを優先度「高」で起動させるにはどのようにすれば良いのでしょうか?

  • 複数のhttpdプロセスを起動する必要性

    # 先に、初心者故に見当違いな質問や間違った用語を使用している # 可能性があることをお詫びしておきます。その際には、お手数ですが # 後学のためにも具体的にご指摘いただければ幸いです。 先日、とある環境でps axした時にhttpdプロセスが複数起動しているのを見ました。 その時は、以下のような感じで、特定ディレクトリ以下にインストールされた複数のバージョンのapacheのhttpdがそれぞれ4~5つ程度起動しているようだったのですが、このように複数のhttpdを起動するのは、どういった時に使う手段なのでしょうか。 (単に複数のホストや複数のIPアドレスを1台のサーバーで運用するのであれば、バーチャルホストという機能が便利であるものと認識しています。) ================= /xxx/yyy/apache2.2.1/bin/httpd -k start /xxx/yyy/apache2.2.1/bin/httpd -k start /xxx/yyy/apache2.2.1/bin/httpd -k start /xxx/yyy/apache2.2.1/bin/httpd -k start /xxx/yyy/apache2.2.1/bin/httpd -k start /xxx/yyy/apache2.2.2/bin/httpd -k start /xxx/yyy/apache2.2.2/bin/httpd -k start /xxx/yyy/apache2.2.2/bin/httpd -k start /xxx/yyy/apache2.2.2/bin/httpd -k start /xxx/yyy/apache2.2.2/bin/httpd -k start /xxx/yyy/apache2.2.3/bin/httpd -k start /xxx/yyy/apache2.2.3/bin/httpd -k start /xxx/yyy/apache2.2.3/bin/httpd -k start /xxx/yyy/apache2.2.3/bin/httpd -k start /xxx/yyy/apache2.2.3/bin/httpd -k start (ディレクトリ名や階層は適当です) ================= また、このように複数のhttpdが起動している場合、ある特定のホストにアクセスした時に、どのhttpdがその処理を受け持つのかを知る方法はあるのでしょうか。

  • C言語でMS-DOSプロンプト入力でプリンタに出力する方法は?

    OS/Win98でVC++を使ってC言語を学習している初心者です. C言語のプログラムでMS-DOSプロンプト上のコマンド入力において プリンタに出力する方法を知りたいです. たとえばMS-DOSプロンプト上で C:>[プログラム名][ファイル名(XXX.txt)] と入力すればプリンターにおいて、入力した[ファイル名(XXX.txt)]が 出力されるようなプログラムを作成したいです. 主にプログラムの流れをどのようにすれば良いか知りたいです. 宜しくお願いします.

  • 常駐し他のプロセスの起動を取得する方法

    test.exeというプログラムを作ります。 実行すると特定のプロセスの起動を待ちます。 特定のプロセスをnotepad.exeとします。 メモ帳(notepad.exe)が起動されたらtest.exeは何かします。 例えばMessageBox()とかで何か表示します。 どうやればいいのでしょうか? ・特定のプロセスが起動するまで待つ ・起動を検知する というところを教えてください。 VC++です。MFC,ATLなどは使いません。 特にウインドウなどはいらないので数行でできてしまうのであれば winmain()からお願いします。

  • 親プロセスの切り離し?

    USBメモリ内で動作するプログラムから、パソコンにインストールされているプログラムを起動後、USBメモリ内にあるプログラムは自動的に終了するようにしています。 この状態で、"ハードウェアの安全な切り外し"で、USBメモリを停止できるようにしたいのですが、何かいい方法はないでしょうか? 試しにメモ帳を利用する、次のコンソールプログラムを作って、USBメモリ内で起動したところ、やはりUSBメモリを停止することができませんでした。 -- #include <windows.h> int main(int argc, char* argv[]) { BOOL bRes; STARTUPINFO si={0}; PROCESS_INFORMATION pi={0}; si.cb = sizeof(STARTUPINFO); if(CreateProcess(NULL, "C:\\Windows\\notepad.exe C:\\a.txt", NULL,NULL,FALSE,0,NULL,NULL,&si,&pi)) { CloseHandle(pi.hProcess); CloseHandle(pi.hThread); bRes=TRUE; } return 0; } -- ※C:\\a.txtは適当なテキストファイルを作成して置いてます。 普段、秀丸エディタを使っているので、試しに "C:\\Windows\\notepad.exe C:\\a.txt" を "C:\\Program Files\\Hidemaru\\Hidemaru.exe C:\\a.txt" に変更した試したところ、USBメモリを停止することができました。 秀丸エディタだとUSBメモリを停止することができるので、起動される側のプログラムで何かすれば停止できるようになるとは思いますが、何をすればいいのかさっぱりわからず困っています。

  • NTでのプロセス出力

    こんにちは。 WindowsNT4.0で、タスクマネージャのプロセス (稼動しているプロセス)を、 テキストにリダイレクト出力したいのですが、 dosプロンプト等を使って何か良い方法はありますでしょうか? よろしくお願いいたします。