C#から、PowerShellのコマンドを実行する

もくじ
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 です。

参考

コマンドで取れた値の、値の部分だけ取る

https://tera1707.com/entry/2024/02/23/231937