1

C#でcmdを開く方法を見つけました。

しかし、Inputstream を使用できるのは 1 回だけです。

コマンド プロセスの作成

ProcessStartInfo CmdInfo = new ProcessStartInfo();
Process cmd = new Process();


CmdInfo.FileName = @"cmd";
CmdInfo.WindowStyle = ProcessWindowStyle.Hidden;
CmdInfo.CreateNoWindow = true;
CmdInfo.UseShellExecute = false;

CmdInfo.RedirectStandardInput = true;
CmdInfo.RedirectStandardOutput = true;
CmdInfo.RedirectStandardError = true;

cmd.EnableRaisingEvents = false;
cmd.StartInfo = CmdInfo;

cmd.Start();

これで、cmd.StandardInput と cmd.StandardOutput を使用できるようになりました。

コマンドを使用

// Use cmd 1
cmd.StandardInput.WriteLine("cd");
cmd.StandardInput.Close(); // if don't close, I can't get output

Console.WriteLine( cmd.StandardOutput.ReadToEnd() ); // Done!

// Use cmd 2
cmd.StandardInput.WriteLine("cd C:\"); // It will occure ObjectDisposedException

この問題を解決したい。

4

2 に答える 2

2

私はあなたがそのアプローチで遠くに行くつもりはないと思います. コードはヒントです ProcessStart ! 新しいプロセスです!プロセスを開始すると、コードが存在するプロセスとは完全に分離されます。この新しいプロセスと通信できる唯一の方法は、COM、リモーティング、またはその他のアプリケーション間通信チャネルを介することです... MSMQ など.

私が知る限り、cmd (コマンド プロンプト) はこれらのいずれも提供しません。

私はあなたがpowershellについて勉強したいと思うと思います...

C# から PowerShell を呼び出す

http://www.codeproject.com/Articles/18229/How-to-run-PowerShell-scripts-from-C

などなど

于 2013-10-11T04:50:18.363 に答える
1

コマンド シェル実行可能ファイルは、入力が閉じられるまで、リダイレクトされた標準入力からのコマンドを処理しません。

次の 3 つの選択肢があります。

  1. コマンドごとに新しいプロセスを作成します。
  2. 実行するすべてのコマンドをパイプライン処理してから、標準入力ハンドルを閉じます。
  3. すべてのコマンドを含むバッチ ファイルを作成し、それを実行します。

コマンドごとに新しいプロセスを作成することを選択した場合は、cmd.exe の「/C」コマンド ライン スイッチを使用して、標準入力を介してコマンドを渡すのではなく、コマンドを実行します。

于 2013-10-11T05:14:58.737 に答える