この記事では、C#からPowerShellを呼び出して実行結果を取得する方法についてご説明します。
【動画】C#からPowerShellを呼び出して実行結果を取得する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
まずはC#からPowerShellが呼び出されPowerShellが実行されます。
PowerShellが実行されると、その実行結果をC#側が受け取りテキストボックスに出力しています。
コードの流れ
取得した実行結果は、今回テキストボックスに出力しています。
フォームの例
今回は下のフォームを用意しました。
実行ボタンをクリックするとPowerShell上でコマンドが実行されて、設置されたテキストボックスに実行結果が出力されます。
なお、今回は以下のコマンド(現在の年月日を取得するコマンド)を実行しています。
(Get-Date).ToString('yyyy/MM/dd')
C#のコード(例)
フォームのコード
using System; using System.Windows.Forms; using System.Diagnostics; namespace wfcs_0056 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { // ProcessStartInfoインスタンスを生成する ProcessStartInfo psi = new ProcessStartInfo { // 実行するプロセス名(今回はPowerShell)を設定する FileName = "powershell", // PowerShell上で実行したいコマンドを取得する(コマンド内容は、現在の年月日を取得する) Arguments = "-command \"(Get-Date).ToString('yyyy/MM/dd')\"", // PowerShellのウィンドウを表示しないように設定する CreateNoWindow = true, // PowerShellの出力結果を標準出力にリダイレクトするように設定する RedirectStandardOutput = true, // シェル機能を使用せずにプロセスを起動する UseShellExecute = false }; // Processインスタンスを生成する Process process = new Process { // PowerShellを実行するのに設定したpsiの情報をProcessインスタンスに設定する StartInfo = psi }; // PowerShellを実行する process.Start(); // C#側の処理を待機する process.WaitForExit(); // PowerShellの実行結果を取得する txb_rtnVal.Text = process.StandardOutput.ReadToEnd(); } } }
注目すべきコード①
最初に見て頂きたいのは16行目から32行目です。
// ProcessStartInfoインスタンスを生成する ProcessStartInfo psi = new ProcessStartInfo { // 実行するプロセス名(今回はPowerShell)を設定する FileName = "powershell", // PowerShell上で実行したいコマンドを取得する(コマンド内容は、現在の年月日を取得する) Arguments = "-command \"(Get-Date).ToString('yyyy/MM/dd')\"", // PowerShellのウィンドウを表示しないように設定する CreateNoWindow = true, // PowerShellの出力結果を標準出力にリダイレクトするように設定する RedirectStandardOutput = true, // シェル機能を使用せずにプロセスを起動する UseShellExecute = false };
コードの説明
以上のコードは、ProcessStartInfoインスタンスを生成して、PowerShellを実行する際の各情報を設定するコードです。
コードの詳細
16行目のコードは、PowerShellを実行するのに必要な情報を設定するためのProcessStartInfoインスタンスを生成します。
このインスタンスを生成することで、PowerShellを実行したり、実行するPowerShellの設定を色々と行うことができます。
19行目のコードでは、実行するプロセス名をFileNameプロパティに設定します。
今回はPowerShellを実行するので、「powershell」を設定しています。
なお、PowerShellの実行ファイルのフルパスを指定してもOKです。
22行目のコードでは、PowerShell上で実行したいコマンドを取得しています。
今回は現在の年月日を取得するコマンドを取得しています。
25行目のコードでは、CreateNoWindowプロパティにtrueを設定しています。
CreateNoWindowプロパティにtrueを設定することで、PowerShellのウィンドウが表示されなくなります。
28行目のコードでは、RedirectStandardOutputプロパティにtrueを設定しています。
RedirectStandardOutputプロパティにtrueを設定することで、PowerShellの実行結果を直接読み取ることができるようになります。
31行目のコードでは、UseShellExecuteプロパティにfalseしています。
UseShellExecuteプロパティにfalseを設定することで、シェル経由で実行されず、PowerShellの起動が直接実行されて高速化されます。(パフォーマンスの向上)
注目すべきコード②
次に見て頂きたいのは35行目から48行目です。
// Processインスタンスを生成する Process process = new Process { // PowerShellを実行するのに設定したpsiの情報をProcessインスタンスに設定する StartInfo = psi }; // PowerShellを実行する process.Start(); // C#側の処理を待機する process.WaitForExit(); // PowerShellの実行結果を取得する txb_rtnVal.Text = process.StandardOutput.ReadToEnd();
コードの説明
以上のコードは、Processインスタンスを生成してPowerShellを実行し、実行結果をテキストボックスに格納する処理のコードです。
コードの詳細
35行目のコードでProcessインスタンスを生成し、37行目でPowerShellを実行するのに設定したpsiの情報をProcessインスタンスに設定します。
psiの情報とは、「注目すべきコード①」で説明した、プロセス名の取得や実行させるコマンドなど、各種プロパティに設定した情報です。
このpsiの情報をProcessインスタンスに設定することで、PowerShellを実行する準備が整います。
42行目では、PowerShellを実行します。
45行目のコードでは、PowerShellの処理よりもC#側の処理が先に終わらないよう、C#側の処理を待機します。
48行目のコードでは、PowerShellの実行結果が格納された変数outputの値をテキストボックスに出力します。
動作確認
「フォームの例」をご覧ください。
最後に
この記事では、C#からPowerShellを呼び出して実行結果を取得する方法についてご説明しました。
C#からPowerShellを呼び出して実行結果を取得したい場合は本記事を参考にして頂けたら幸いです。
プログラミングのスキルを習得するなら
プログラミングのスキルを習得したい、今のスキルをもっと高めたい、そう考えているなら「プログラミングスクール」がおすすめです。
プログラミングのスキルの基礎を身につけるなら「TechAcademy」で1週間の無料体験があるので、これで「プログラミングの基礎」を学ぶのにおすすめですよ。