[C#] コマンド(cmd)を実行する方法(Processクラス)


Devlopment note / C#    作成日付 : 2020/03/31 07:15:40   修正日付 : 2020/03/31 07:16:19

こんにちは。明月です。


この投稿はC#でコマンド(cmd)を実行する方法(Processクラス)に関する説明です。

C#を利用してプログラミングすることは普通はWindow環境で構築します。CoreでLinux環境やIOT環境でCoreを使いますが、まだ多くあることではありません。

そのため、Processクラスを利用すればWindow Commandを操作できるようなプログラムを開発できます。

using System;
using System.Diagnostics;
namespace ProcessExample
{
  // Processクラスを継承する。
  class Program : Process
  {
    // コンストラクタ
    public Program()
    {
      // Process環境設定クラス
      ProcessStartInfo startInfo = new ProcessStartInfo();
      // 実行するプログラム名
      startInfo.FileName = "CMD.exe";
      // シェル配置設定 = false
      startInfo.UseShellExecute = false;
      // 入力Streamを使用可否
      startInfo.RedirectStandardInput = true;
      // 出力Streamを使用可否
      startInfo.RedirectStandardOutput = true;
      // エラーStreamを使用可否
      startInfo.RedirectStandardError = true;
      // Processを終了時(Close関数を呼出す時)、イベント発生可否
      base.EnableRaisingEvents = false;
      // Processクラスに環境設定
      base.StartInfo = startInfo;
      // 実行関数呼び出す
      Executor();
    }
    // 実行関数
    public void Executor()
    {
      // 作業開始ディレクトリ
      base.StartInfo.WorkingDirectory = @"C:\";
      // コンソール画面に表示
      Console.Write(base.StartInfo.WorkingDirectory + ">");
      // exitコマンドが入力されるまで無限ループ
      while (true)
      {
        // コンソールからコマンドを受け取る。
        string cmd = Console.ReadLine();
        // exitコマンドが入力される時に終了する。
        if ("exit".Equals(cmd.Trim(),StringComparison.OrdinalIgnoreCase))
        {
          // 無限ループ終了
          break;
        }
        try
        {
          // Process開始(cmd.exe実行)
          base.Start();
          // 入力Streamのリソース設定
          using (base.StandardInput)
          {
            // cmd.exe実行した後、コマンドを入力する
            base.StandardInput.Write(cmd + Environment.NewLine);
          }
          // エラーStreamのリソース設定
          using (base.StandardError)
          {
            // Cmd.exeからエラー出力をStringで取得する。
            var ret = base.StandardError.ReadToEnd();
            // データがなければ、
            if (!String.IsNullOrWhiteSpace(ret))
            {
              // コンソールに出力する。
              Console.WriteLine(ret);
            }
          }
          // 出力Streamのリソース設定
          using (base.StandardOutput)
          {
            // Cmd.exeから出力をStringで取得する。
            var ret = base.StandardOutput.ReadToEnd();
            // 出力データに改行を入れる。
            cmd += "\r\n";
            // 出力Streamに入力値も含めているので、それを除く。
            Console.Write(ret.Substring(ret.IndexOf(cmd) + cmd.Length));
            // cmd.exeコマンドは最後にディレクトリがある。それを取得してディレクトリ設定を再更新
            String buffer = ret.Substring(ret.LastIndexOf("\r\n\r\n") + 4);
            // 最終ディレクトリをWorkDirectoryに設定
            base.StartInfo.WorkingDirectory = buffer.Substring(0, buffer.Length - 1);
          }
        }
        catch (Exception e)
        {
          // エラーが発生する時にディレクトリ再設定
          base.StartInfo.WorkingDirectory = @"C:\";
          // エラーをコンソールに出力する。
          Console.WriteLine(e);
        }
        finally
        {
          // cmd.exe終了
          base.Close();
        }
      }
    }
    // メイン実行関数
    static void Main(string[] args)
    {
      // プログラム実行
      new Program();
      // コンソール待機
      Console.WriteLine("Press any key...");
      Console.ReadKey();
    }
  }
}


上の結果をみれば始めDドライブでコンソールが始まります。まるでcmdコマンドらしくカーソルがc:>の次にフォーカスになっています。そしてディレクトリ変更する時にドライブc:\ディレクトリ>で表示されます。最終、dirコマンドを実行してファイルリストを取得します。最後にexitのコマンドでProcessプログラムを終了します。


参考に上の結果はcmd.exeプログラムではなく、cmd.exeと最大に似ているUIで作りました。ほぼそっくりです。


ここまでC#でコマンド(cmd)を実行する方法(Processクラス)に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

最新投稿