C#でPowerShellを操作してみる
C#でPowerShellを操作してみる
もともとC#でのコーディングをしていますが、仕事でPowerShellコマンドを使うことがでてきました。
別にPowershellコマンドで読み込んだデータを処理することもできるのですが、なぜかデータの絞り込みができない状態にあい、どうにかコマンド後にデータ操作できないかと考えていました。
そこで行き着いた答えが、Powershellコマンドでデータをログファイルなどに出力し、C#側でログファイルを読み込んで操作すれば良いと行き着きました。
powershellだけでもやりようはあると思いますが、慣れているC#に逃げたわけです。。。
しかし、Powershellコマンドとexeが別で起動させるのも面倒ですので、今回はC#側からPowershellコマンドを実行し、そのままファイル読み込みを行う方針で実装しようと思います。
C#でPowershellを操作するには
C#でPowershellコマンドを使用するには、System.Management.Automation.dllを使用します。
上記dllファイルは「C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0」のパスに存在しています。
もし上記のパスに存在しない場合は、「C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Management.Automation\v4.0_3.0.0.0__31bf3856ad364e35」にあるかもしれません。パスのバージョン名などは環境によって異なるかもしれないので、そこはご自身の環境に合わせてください。
実際のコードとしてはシンプルで、powershellコマンドを文字列として作成するか、ps1のファイルを指定できるようにします。その文字列もしくはパスを引数としてInvokeメソッドを呼びだし。戻り値について処理を行うだけになります。
アプリケーションのイベントログを取得するpowershellコマンドを使い、指定のディレクトリに出力するコマンドを実行できるコードを作成してみます。
string source = "Get-EventLog Application -After \"2021/05/03 12:00:00\" | Out-File -FilePath \"D:\\cs\\system.log\""; using (var invoker = new RunspaceInvoke()) { var result = invoker.Invoke(source); }コードとしてはこれだけです。今回はコマンドでファイル出力を行うため戻り値に対して何もしませんが、戻り値がある場合には変数resultに対してforeachなどで処理を行います。
データの処理
先ほどPowershellコマンドを実行できるようになったので、出力されたファイルに関しては通常通り読み込んでListなどで管理を行えば好きなように処理ができます。
もちろん、上記の例のようなコマンドならC#側から呼び出す必要はないですが、C#側からpowershellコマンドを実行できるメリットはあるはずなので、これを使って何かプログラムが作成できないものか検証はしてみたいと思います。
まとめ
今回はC#からPowershellコマンドを実行するコードを書いてみました。
実用性は分かっていませんが、これを使って何かしらのプログラムが作成できるのではと考えています。複数のps1ファイルを作成して、それらを一括で起動させるときなどに使えるかもしれません。また何かを思いつて作成したらまとめたいと思います。
今回はこの辺で、ではまた!
コメント
コメントを投稿