Windowsフォームアプリケーションからコマンドプロンプトを起動して、コマンドを実行した際に出る出力をフォームアプリケーション側から受け取ろうとしています。

テスト内容では成功するのですが、受け取りたい対象の内容は取得できずに困っています。
例えばコマンドプロンプト上で hoge と入力し実行すると

「'hoge' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」

と表示されます。
しかし、前述カッコ内の表示をアプリケーション側から受け取ることが出来ませんでした。
どのようにすれば受け取ることができるでしょうか?
単純な path などを実行した場合は受け取れました。
以下が試した内容です。

Process ps = new Process();
ps.StartInfo.FileName = Environment.GetEnvironmentVariable("ComSpec");
ps.StartInfo.Arguments = @"/C hoge";
ps.StartInfo.UseShellExecute = false;
ps.StartInfo.RedirectStandardOutput = true;
ps.StartInfo.CreateNoWindow = true;
ps.Start();
string output = ps.StandardOutput.ReadToEnd();
ps.WaitForExit();
ps.Dispose();

MessageBox.Show(output);//空の内容しか表示されない
//テストで hoge を path にした際はシステム環境変数が表示された


・環境
Windows 7 Professional 64bit
VC# 2010 Express

よろしくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

「'hoge' は、内部コマンドまたは外部コマンド、


操作可能なプログラムまたはバッチ ファイルとして認識されていません。」

だったら、たぶん標準エラー出力に出力されてると思うんですが。
    • good
    • 0
この回答へのお礼

ありがとうございます!

RedirectStandardErrorをtrueにしてStandardError.ReadToEnd()から取得してみたところ、無事表示することが出来ました。

お礼日時:2011/04/26 05:58

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qc#でコマンドプロンプトを実行する方法

コマンドプロンプト上から音楽ファイルの変換が出来るffmpegを利用して
C#プログラムを作ろうと思い、下記のサイトを参考にしてc#プログラムを作りコマンドを入力してみたのですがうまくいきません。
しかし、同じコマンドをコマンドプロンプトを手動で開いて打ち込むと成功します。

参考にしたサイト:http://dobon.net/vb/dotnet/process/standardoutput.html
入力したコマンド:"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
 ※コマンドの-b:a 320kの表記は320kbpsのビットレートで変換するコードです。
 ※a.m4aをa.mp3に320kbpsのビットレートで変換するコマンドになります。

現状をまとめると以下のようになります。
(1)コマンドプロンプトを手動で起動して、以下のコマンドを打ち込むとうまく変換してくれる。
"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
(2)しかしこのコマンドを下記のコードで実行すると処理が行われない。
(3)そうなると下記のコード自体に問題があるように思われるが、
下記のコードで"dir c:\"など簡単なコマンドを実行すると成功する。

ダブルクオテーション(")やスペースなどに問題があるのかと思いいろいろと試してみましたがダメでした。
どうすれば下記のコードで"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"のようなコマンドを実行出来るのでしょうか?
実行する方法、もしくは違うコードで実行する方法などを知っておられる方、ぜひご教授ください!非常に困っております。


---------------------------------------------------------------------------------------------------
■コマンドプロンプトをC#上から実行するコード
http://dobon.net/vb/dotnet/process/standardoutput.htmlのコードの丸写し
---------------------------------------------------------------------------------------------------
//Processオブジェクトを作成
System.Diagnostics.Process p = new System.Diagnostics.Process();

//ComSpec(cmd.exe)のパスを取得して、FileNameプロパティに指定
p.StartInfo.FileName = System.Environment.GetEnvironmentVariable("ComSpec");
//出力を読み取れるようにする
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = false;
//ウィンドウを表示しないようにする
p.StartInfo.CreateNoWindow = true;
//コマンドラインを指定("/c"は実行後閉じるために必要)


//○成功する
p.StartInfo.Arguments = "dir c:\";
//×失敗する
p.StartInfo.Arguments = "\"E:/ffmpeg.exe\" -i \"E:/a.m4a\" -b:a 320k \"E:/a.mp3\";


//起動
p.Start();
//出力を読み取る
string results = p.StandardOutput.ReadToEnd();
//プロセス終了まで待機する
//WaitForExitはReadToEndの後である必要がある
//(親プロセス、子プロセスでブロック防止のため)
p.WaitForExit();
p.Close();

//出力された結果を表示
Console.WriteLine(results);
---------------------------------------------------------------------------------------------------

コマンドプロンプト上から音楽ファイルの変換が出来るffmpegを利用して
C#プログラムを作ろうと思い、下記のサイトを参考にしてc#プログラムを作りコマンドを入力してみたのですがうまくいきません。
しかし、同じコマンドをコマンドプロンプトを手動で開いて打ち込むと成功します。

参考にしたサイト:http://dobon.net/vb/dotnet/process/standardoutput.html
入力したコマンド:"E:/ffmpeg.exe" -i "E:/a.m4a" -b:a 320k "E:/a.mp3"
 ※コマンドの-b:a 320kの表記は320kbpsのビットレートで変換するコー...続きを読む

Aベストアンサー

>うまくいきません。

「なにが」「どう」「いまくいかない」んでしょうか?

プロセス起動した後に無反応になる?
プロセス終了した後に表示されるべきメッセージが表示されない?
プロセス起動できない?
起動したffmpeg.exeが終了しても戻ってこない?

参考ページではcmd.exeに/cオプションを指定しているようですが、
変更されたソースでは指定していないようで…。
その場合、
p.WaitForExit();
でちゃんと戻ってこれるんですかね?
# 起動したcmd.exe自体は終了していないはずですが…
# /Cも/Kも無かった場合ってどういう動作するんですかね?(Windows7 Pro 64Bitでcmd dirとしたら無視されてしまいましたが)

cmd.exe経由でなくても、必要条件満たせばffmpeg.exeの起動は可能と思いますよ。
ffmpeg.exeを利用するフロントエンドアプリなんかもそうしているでしょうし。
「ffmpeg.exe フロントエンド」で検索してみるとアプリは見つかるかと。

Q【C#】 DOSコマンドを使いたい

Visual Stadio.NET 2003 C#で開発中です。

質問したい内容は、プログラムからコマンドプロンプトを操作をすることなんですが、
例えば、(コマンドプロンプトの画面で)
d:
cd a
とやるようなコードを教えて下さい。
一行だけのコマンドならネット上にもあったのですが、複数行続けて打つようなやり方を見つけられなかったので、宜しくお願いします。

Aベストアンサー

string[] strCmds = {@"/c dir c:\*.* /w", @"/c dir c:\work /w"};

for ( int i = 0; strCmds.Length; i++ )
{
psi.Arguments = strCmds[i];
System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);

string results = p.StandardOutput.ReadToEnd();
p.WaitForExit();

Console.WriteLine(results);
}

といった感じでしょうか。(一部抜粋したコードです。 あとはDOBONさんのところを参照ください)
私の環境で、動作を確認しています。

QC#でのbatファイル実行結果取得

既存のbatファイルが存在し、C#プログラムより、実行結果コ-ドを取得したいのですが、どうやっても「0」が帰ってきましまい、悩んでいます。 よいアドバイス&指摘を下さい。

<batファイル>
 @echo off
 set RET_CODE=%1
 echo %RET_CODE%
 exit /b %RET_CODE%

<C#プログラム>
 ProcessStartInfo psInfo = new ProcessStartInfo();
 psInfo.FileName = @"D:/app/Send.bat";
 psInfo.Arguments = "45";
 psInfo.CreateNoWindow = true;
 psInfo.UseShellExecute = false;
 psInfo.RedirectStandardOutput = true;
 Process ps= Process.Start(psInfo);
 string st = ps.StandardOutput.ReadToEnd(); ← 何も出ない?
 ps.WaitForExit();
 string rt = ps.ExitCode.ToString(); ← 必ず「0」が返却?

既存のbatファイルが存在し、C#プログラムより、実行結果コ-ドを取得したいのですが、どうやっても「0」が帰ってきましまい、悩んでいます。 よいアドバイス&指摘を下さい。

<batファイル>
 @echo off
 set RET_CODE=%1
 echo %RET_CODE%
 exit /b %RET_CODE%

<C#プログラム>
 ProcessStartInfo psInfo = new ProcessStartInfo();
 psInfo.FileName = @"D:/app/Send.bat";
 psInfo.Arguments = "45";
 psInfo.CreateNoWindow = true;
 psInfo.UseShellExecute = false;
 psInfo.Redi...続きを読む

Aベストアンサー

追記の追記。

psInfo.FileName = @"D:/app/Send.bat";
psInfo.Arguments = "45";
と書くと、実は
psInfo.FileName = @"C:\WINDOWS\SYSTEM32\CMD.EXE";
psInfo.Arguments = @"D:/app/Send.bat 45";
と言うように「CMD.EXEが起動するように、Windowsが小細工をする」のです。

そのため、Send.batは「子プロセスのCMD.EXEが実行」します。

その為
exit /b 終了コード
と書くと、この終了コードは「子プロセスとして動いているCMD.EXEのERRORLEVELになるだけで、CMD.EXEの終了コードにはならない」のです。

そして、Send.batを実行し終わった子プロセスのCMD.EXEは「これ以上、もう、何もする事がなく、正常終了してしまう」ので「正常終了時の終了コードとして0で終了」します。

終了コードが0で終了すれば、当然
ps.ExitCode
の値は「常に0」です。

そういう訳で「子プロセスとして動いているCMD.EXEを終了させ、終了コードを持たせる」には
exit 終了コード
と書いて「/b無しのexitコマンドを実行」しなければなりません。

こうすれば「Send.batを起動した子プロセスのCMD.EXEの終了コードが、exitコマンドで指定した値になる」のです。

exitコマンドで指定した値が終了コードになれば、当然
ps.ExitCode
の値も「引数で渡した値」になります。

追記の追記。

psInfo.FileName = @"D:/app/Send.bat";
psInfo.Arguments = "45";
と書くと、実は
psInfo.FileName = @"C:\WINDOWS\SYSTEM32\CMD.EXE";
psInfo.Arguments = @"D:/app/Send.bat 45";
と言うように「CMD.EXEが起動するように、Windowsが小細工をする」のです。

そのため、Send.batは「子プロセスのCMD.EXEが実行」します。

その為
exit /b 終了コード
と書くと、この終了コードは「子プロセスとして動いているCMD.EXEのERRORLEVELになるだけで、CMD.EXEの終了コードにはならない」の...続きを読む


人気Q&Aランキング

おすすめ情報