トップ回答者
コマンドラインのラッパーを作ろうとしています。

質問
-
いつもお世話になります。
VisualC#2010、WindowsXPでの動作について質問があります。
http://support.microsoft.com/kb/305994/ja
でコマンドラインのラッパーを作ろうとしています。ためしに、dirしてみようと、
newProcess.StartInfo.FileName = @"C:\Windows\system32\cmd.exe";
newProcess.StartInfo.Arguments = "dir";としたところ、
C:\WINDOWS\twain_32>dir
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は DCAA-DCDC ですC:\WINDOWS\twain_32 のディレクトリ
2009/05/21 18:22 <DIR> .
2009/05/21 18:22 <DIR> ..
2008/04/14 21:00 3,584 wiatwain.ds
1 個のファイル 3,584 バイト
2 個のディレクトリ 30,134,657,024 バイトの空き領域C:\WINDOWS\twain_32>
を期待していたのに、
Microsoft Windows XP (Version 5.1.2600)
(C) Copyright 1985-2001 Microsoft Corp.C:\Documents and Settings\username\My Documents\command\command\bin\Debug>
が戻ってきました。
dirってcmd.exeじゃないんでしたっけ?
回答
-
コマンドラインのプロセス実行をする場合、プロセスの標準入力にテキストを書きこむ
という方法があります。
// プロセス実行 ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec"); psi.RedirectStandardInput = true; psi.RedirectStandardOutput = true; psi.UseShellExecute = false; psi.CreateNoWindow = true; Process prc = Process.Start(psi); prc.StandardInput.WriteLine("dir"); prc.StandardInput.WriteLine("exit"); // 実行結果 MessageBox.Show(prc.StandardOutput.ReadToEnd()); prc.WaitForExit();
この場合、dirコマンドの後に連続してコマンドを書きこむ場合など、どこでコマンドが
失敗したかを取得することが困難です。
なので一連のコマンド処理をバッチファイルに書きこんで、実行後にファイルを削除
する方法が簡単かもしれません。
// バッチファイル作成 Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS"); File.WriteAllText("hoge.bat", "dir", sjisEnc); // プロセス実行 ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = "hoge.bat"; psi.RedirectStandardInput = true; psi.RedirectStandardOutput = true; psi.UseShellExecute = false; psi.CreateNoWindow = true; Process prc = Process.Start(psi); // 実行結果 MessageBox.Show(prc.StandardOutput.ReadToEnd()); prc.WaitForExit(); File.Delete("hoge.bat");
- 回答としてマーク d-kot 2011年2月1日 3:50
すべての返信
-
コマンドラインのプロセス実行をする場合、プロセスの標準入力にテキストを書きこむ
という方法があります。
// プロセス実行 ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = System.Environment.GetEnvironmentVariable("ComSpec"); psi.RedirectStandardInput = true; psi.RedirectStandardOutput = true; psi.UseShellExecute = false; psi.CreateNoWindow = true; Process prc = Process.Start(psi); prc.StandardInput.WriteLine("dir"); prc.StandardInput.WriteLine("exit"); // 実行結果 MessageBox.Show(prc.StandardOutput.ReadToEnd()); prc.WaitForExit();
この場合、dirコマンドの後に連続してコマンドを書きこむ場合など、どこでコマンドが
失敗したかを取得することが困難です。
なので一連のコマンド処理をバッチファイルに書きこんで、実行後にファイルを削除
する方法が簡単かもしれません。
// バッチファイル作成 Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS"); File.WriteAllText("hoge.bat", "dir", sjisEnc); // プロセス実行 ProcessStartInfo psi = new ProcessStartInfo(); psi.FileName = "hoge.bat"; psi.RedirectStandardInput = true; psi.RedirectStandardOutput = true; psi.UseShellExecute = false; psi.CreateNoWindow = true; Process prc = Process.Start(psi); // 実行結果 MessageBox.Show(prc.StandardOutput.ReadToEnd()); prc.WaitForExit(); File.Delete("hoge.bat");
- 回答としてマーク d-kot 2011年2月1日 3:50