.NET Frameworkでコマンドライン実行

このQ&Aのポイント
  • VC++2008 C++/CLI .NET Framework 2.0以降を使用しています。コマンドラインを実行する方法について教えてください。
  • System.Diagnostics.ProcessクラスのStartメソッドを使用してコマンドラインを実行する方法を教えてください。
  • バッチファイルを作成する前に、.NET Frameworkを使用してコマンドラインを実行する方法を教えてください。
回答を見る
  • ベストアンサー

.NET Frameworkでコマンドライン実行

お世話になります。 VC++2008 C++/CLI .NET Framework 2.0以降を使用しています。 以前、VC++6.0でWin32 APIのCreateProcess()の第2引数に コマンドラインを設定し、使用していました。 今回、これを.NET Frameworkを使用して実装することになりました。 System.Diagnostics.ProcessクラスのStartメソッドが Win32APIのCreateProcess()に相当するらしいのですが、 ProcessクラスのStartInfoプロパティにはコマンドラインを 設定するような場所がありません(FileNameはあるんですけど)。 どのようにしたらコマンドラインを実行することができるのでしょうか。 ご存知の方、どうぞご教授ください。 よろしくお願いいたします。 #元のコードを実装したり、バッチファイルを作るのは #最後の手段なので、そうならないようにしたいです。

  • FAY
  • お礼率59% (16/27)

質問者が選んだベストアンサー

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

processHoge->Start("C:\\hoge\\hoge.exe", "ArgA ArgB ArgC"); とする、もしくは processHoge->StartInfo->FileName = "C:\\hoge\\hoge.exe"; processHoge->StartInfo->Arguments = "ArgA ArgB ArgC"; processHoge->Start(); とすればいいのでは。 これがダメな理由が何かあるんでしょうか? CreateProcess()もMSDN Libraryを読む限りでは ::CreateProcess(NULL, "C:\\hoge\\hoge.exe ArgA ArgB ArgC", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); と ::CreateProcess("C:\\hoge\\hoge.exe", "ArgA ArgB ArgC", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); は同等動作に見えるのですが。 #ついでに::CreateProcess("C:\\hoge\\hoge.exe ArgA ArgB ArgC", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi );も

FAY
質問者

お礼

あう。おっしゃる通りです。 > processHoge->StartInfo->FileName = "C:\\hoge\\hoge.exe"; > processHoge->StartInfo->Arguments = "ArgA ArgB ArgC"; > processHoge->Start(); で動きました。 ・・・がDOSウィンドウが開いてしまいますね・・・ もうちょっと調査してみます。 締切はもうしばしお待ちください。

FAY
質問者

補足

どうやら下のDOSウィンドウが開いてしまうのは 立ち上げているアプリケーション固有の問題のようです。 というわけでとりあえずの目的は達成できました。 ありがとうございました。 #お礼欄と補足欄の記入位置が逆になってしまい申し訳ありません

その他の回答 (1)

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

アプリケーションに渡すオプションをどう指定してやるか、って事でいいですか? であれば、↓の一番上のプロパティを参照。 http://msdn.microsoft.com/ja-jp/library/system.diagnostics.processstartinfo_members.aspx まぁProcess.Start()で直接渡すこともできるようですが。 http://msdn.microsoft.com/ja-jp/library/system.diagnostics.process.start.aspx

FAY
質問者

補足

回答ありがとうございます。 いえ、Processクラスの基本的な使い方は サンプルもありますし、なんとなくはわかるんです。 元のVC++6.0のコードは STARTUPINFO si; PROCESS_INFORMATION pi; ::ZeroMemory(&si, sizeof(STARTUPINFO)); ::ZeroMemory(&pi, sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; CString szCommand = "C:\\hoge\\hoge.exe ArgA ArgB ArgC"; ::CreateProcess(NULL, (LPSTR)(LPCTSTR)szCommand, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi ); というような内容のコードです(思いっきり省略してますが...)。 それに対して今回は String^ stringCommand = "C:\\hoge\\hoge.exe ArgA ArgB ArgC"; Process^ processHoge = gcnew Process; processHoge->StartInfo->CreateNoWindow = true; // StartInfoにコマンドラインを指定するメンバがない GhostScriptProcess->Start(); としているのですが、上のコメントの通り、 StartInfoにコマンドラインを指定するメンバがないためどうしたらいいのかなと。 それで、せっかく.NET Frameworkを使うので元のコードを実装したくないんです。 また、stringCommandの内容をバッチファイルに出力し、 processHoge->StartInfo->FileName = "Hoge.bat" というように設定してやればできるんですが、 バッチファイルを使用するとDOS窓が出てしまのうので、これも なるべくしたくないんです。 Processクラスにこだわるつもりはないので、 他の方法でもやり方があれば教えていただきたいです。

関連するQ&A

  • VB.NETでCreateProcess

    VB.NET(2003)で、別exeを起動し、終了まで待機するということをするために、 system.Diagnostics.Processクラスを使用していました。 しかし、実際に動かす環境がMetaFrameなのですが、 その環境では、このクラスは使用できないようで画面の起動すらできなくなります。 ですので、別の方法ということで、APIのCreateProcess、WaitForSingleObjectを使用するように変更したいのですが、 VB.NETでのサンプルが余り無いため、パラメータにどのように設定するかなどがよくわかりません。 API自体使ったことが無いので、根本的にわから無すぎるのです・・・ VB.NETでAPI利用サンプルが多く掲載されているサイト、 できれば、CreateProcess、WaitForSingleObjectを使用しているサンプルなどありましたら、ご教授願います。 よろしくお願いいたします。

  • 32bitアプリから64bitアプリのコマンドを実行する方法

    VC++6.0でWin32アプリを開発中ですが、 64bitOS(WindowsXPx64,Windows Vista x64)でCreateProcess()やShellExecute() などを使用してコマンドを実行したいのですが、その時に64bitモードでそのコマンドを 実行する必要があります何か方法はないでしょうか?  32bit用のアプリから64bitモードとしてコマンド実行することが目的です。   CreateProcessなどとは別の方法でも構いません。 よろしくお願い致します。

  • Query sessionを実行させるには?

    お世話になります。   DOSコマンドの"QUERY SESSION"で得たセッション情報を元に、 処理を行いたいと考えております。   そこでVB2010にて下記のプログラムを試したのですが、肝心の"QUERY SESSION"が   『操作可能なプログラム(中略)として認識されていません。』として実行されません。   ---------------------------------------------------------         '--Processオブジェクトを作成         Dim pr As New System.Diagnostics.Process         pr.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec")         p.StartInfo.UseShellExecute = False         p.StartInfo.RedirectStandardOutput = True         p.StartInfo.RedirectStandardInput = False           'コマンドラインを指定         pr.StartInfo.Arguments = "/c QUERY SESSION"  '<--------問題個所?           pr.Start()           '出力を読み取る         Dim results As String = pr.StandardOutput.ReadToEnd()           pr.WaitForExit()         pr.Close()   --------------------------------------------------------- 上記のコマンドラインの部分を、         pr.StartInfo.Arguments = "/c ipconfig" など他のDOSコマンドに変えると正常に動作するのですが、   例えば下記の様に別表現でQuery sessionを指定しても同様のエラーが返されるばかりです。         pr.StartInfo.Arguments = "C:\windows\System32\qwinsta.exe"   何が原因となっているのかも分からず困っております。   どうか、お知恵をお貸しください。宜しくお願い致します。

  • CreateProcessのコマンド・ライン文字列

    ■開発環境:VisualStudio2005 VC++ CreateProcessの第2引数についての質問なのですが、 第二引数は実行するコマンドライン文字列となりますが、この引数のサイズがある一定のサイズを超えるとCreateProcessの実行でエラーになります。 その場合のGetLastError()の番号は87=ERROR_INVALID_PARAMETERです。 どうも、CreateProcessの第2引数のサイズに上限があるように思います。 どなたこのあたりの情報を持っておられる方いますでしょうか? 以上、ご教授よろしくお願いします。

  • 他のアプリが起動しているプログラムの、コマンドラインを取得したい

    あるwinアプリ(1)が、コンソールプログラム(2)を起動中だとして、 他のwinアプリ(3)が、(1)が起動している(2)のコマンドラインパラメータを取得する方法はあるのでしょうか? もし、あるようでしたらその方法を、教えて頂けないでしょうか。 winアプリ(3)は、VC6作成の、win32APIアプリです。 よろしくお願い致します。

  • 「応答なし」の状態を監視する方法

    CreateProcess()で起動したプロセスの状態を監視したいと思っています。 タスクマネージャで見たときの「応答なし」の状態を検出するWin32APIなどの関数はあるでしょうか。 <環境> WindowsXP VC++ 6.0

  • 【VB2005】コンソールアプリ実行時のコマンドプロンプトの非表示方法

    22歳男性です。 vb2005で開発してます。 コンソールアプリケーション実行時に表示されるコマンドプロンプトを非表示(タスクバーにも表示されない)にしたいのですがやり方がわかりません。 私が調べたところ「System.Diagnostics.Process」クラスを使用すると外部アプリ(コマンドプロンプトなど)の操作はできるようです。ですが、私は外部アプリの操作ではなく、実行ファイル自身が実行時に表示するコマンドプロンプトを非表示にしたいので、「System.Diagnostics.Process」クラスでは実現不可と考えています。 それと、このことを実現するために、新たに実行ファイルを作るのではなく、あくまで既存の実行ファイルに「コマンドプロンプトを非表示にする」コードを埋め込むことを理想としています。そのため、実行ファイルが2つ以上になる(実際に実行するファイルと、その実行ファイルのコマンドプロンプトを操作する実行ファイル)ような考えは求めてません。 もし知っている方がいらっしゃいましたら、「使用するクラス」「具体的なコード」などを記述していただけたらありがたいです。 宜しくお願いします。

  • コマンドライン引数について

    フォームの中にボタン(button1)があり、ボタンを押すと別のアプリケーションを起動するようなプログラムを作っています。 別アプリケーションを起動するのに次のようにShell関数を使ってコマンドライン引数"A"を渡していますが、     Shell("Test.exe A", AppWinStyle.NormalFocus) アプリケーションの終了を確認する必要があり、ProcessコンポーネントのExitedイベントを利用したいので、Shell関数を止めて以下のようなコードにしたいと思っています。 Private Sub Button1_Click(ByVal sender As System.Object, _             ByVal e As System.EventArgs) Handles Button1.Click     Process1.StartInfo.FileName = "Test.exe"     Process1.Start() End Sub Private Sub Process1_Exited(ByVal sender As System.Object, _             ByVal e As System.EventArgs) Handles Process1.Exited     '(ここにアプリケーション終了時の処理コードを記述) End Sub このとき、コマンドライン引数を渡すにはどのようにすればよいでしょうか? どなかたご教授いただけると助かります。どうぞよろしくお願い致します。

  • CreateProcessでの実行ファイルの操作について

    VC++ 6.0 Win98 カレントディレクトリに実行ファイルをいれておいて、szCommand[]="eee"とすると(eeeは実行ファイルです。)実行してくれるのですが、相対パスや絶対パスを使うと実行をしてくれません。 CreateProcessでは、相対パスや絶対パスは使えないのでしょうか? ちなみにコマンドラインから直接(相対パスや絶対パスを使用して)に打つと実行ファイルが動作します。 あと、リダイレクトも使えないのでしょうか?(動作しなかったので・・) STARTUPINFO si; ZeroMemory(&si,sizeof(STARTUPINFO)); si.cb=sizeof(STARTUPINFO); si.dwFlags=STARTF_USESTDHANDLES; si.hStdOutput=hFile; si.hStdError=hFile; char szCommand[]= "C:\\\"My Documents\"\\nannka\\VC++\\Ten3\\eee"; PROCESS_INFORMATION pi; CreateProcess( NULL, szCommand,//コマンド //NULL, NULL,NULL, TRUE, 0, NULL,NULL, &si,&pi ); よろしくお願いします。

  • メニューを追加した時の実装を書くクラスは?

    環境 WIN98 VC++6.0 MFC にて メニューにコマンドを追加しクラスウィザードにて、コマンドの実装をするときに、CxxxMainFrmクラスとCxxxViewクラスのどちらにも実装出来ます。 どうしてどちらにも実装できるのですか? また、それぞれの使い分けはどうなっているのですか?