もくじ
https://tera1707.com/entry/2022/02/06/144447
やりたいこと
C#のコードから、PowerShellのコマンドを実行して、その戻り値を受け取りたい。
やりかた
Process.Start()
で、 PowerShell.exe
を実行し、そのArgumentに、PowerShellのコマンドと引数を載せる。
で、標準出力に出された出力の文字列を受け取る。
サンプルコード
実験的に、Get-AppxPackage
で、私のPCに入っている「WinUI3 ギャラリー」のパッケージアプリのバージョンを取ってみる。
その際のPowerShellコマンドは、以前調べたこの記事のやり方を使う。
((Get-AppxPackage Microsoft.WinUI3ControlsGallery | Select Version).Version
の部分)
using System.Diagnostics; namespace ConsoleApp3 { internal class Program { static void Main(string[] args) { var v = GetWinUI3GalleryVersion(); if (v is null) { Console.WriteLine("バージョンを取得できませんでした。"); return; } Console.WriteLine($"あなたのWinUI3Galleryのバージョンは {v.Value.Major}.{v.Value.Minor}.{v.Value.Build}.{v.Value.Revision} です。"); } // WInUI3ギャラリーのバージョンを取得する static (string Major, string Minor, string Build, string Revision)? GetWinUI3GalleryVersion() { // psコマンド実行 var all = GetPowerShellCommandReturn("(Get-AppxPackage Microsoft.WinUI3ControlsGallery | Select Version).Version"); // 取得できなかった場合はnullを返す if (all == string.Empty) return null; // バージョンは、「*.*.*.*」形式で取得される var versionNumStrs = all.Split(Environment.NewLine).First().Split('.'); return (versionNumStrs[0], versionNumStrs[1], versionNumStrs[2], versionNumStrs[3]); } static string GetPowerShellCommandReturn(string psCommandWithArgs) { var psInfo = new ProcessStartInfo(); psInfo.FileName = @"PowerShell.exe"; psInfo.CreateNoWindow = true; psInfo.WindowStyle = ProcessWindowStyle.Hidden; psInfo.UseShellExecute = false; psInfo.Arguments = psCommandWithArgs; psInfo.RedirectStandardOutput = true; // 標準出力をリダイレクト psInfo.RedirectStandardError = true; // 標準エラー出力をリダイレクト var p = Process.Start(psInfo); string all = p.StandardOutput.ReadToEnd(); // 標準出力の読み取り return all; } } }
実行結果
あなたのWinUI3Galleryのバージョンは 2.3.0.0 です。
参考
コマンドで取れた値の、値の部分だけ取る