PowerShellメモ C#のコードをPowerShellのスクリプトの中で実行してみる

PowerShell

VBSではできなかった?最初はPowerShellもできなかったみたいだけど、PowerShell 2.0なるバージョンからできるようになったっぽいので試してみることに。

ポイントはこんなとこかね。

  • C#のコードをファイルとして読み込んで文字列の編集に格納する
  • Add-Typeのコマンドレットで読み込んだC#のコードを認識させる
  • [クラス名]::メソッド名(引数)って形でC#のコードに書いてあるメソッドを呼び出す

で、PowerShellのスクリプトはこんな感じ。
valueって名前の引数で実行するときに指定した文字列を受け取るようにしてる。

# 引数を変数に設定する
Param
(
	[string]$value
)

# C#のコードをファイルから読み取る
# ※PowerShell 2.0以前の場合はGet-Contentでファイルを読み込むと改行が
#   区切り文字になってデータが複数あるってことで配列として認識されてしまうので
#   配列の各要素にある文字列を連結して1つの文字列にする必要がある
#   $source = (Get-Content $filename) -join "`n"
$filename = "Proto.cs"
$source = Get-Content $filename -Raw

# C#のコードをビルドして実行する
Add-Type -Language CSharp -TypeDefinition $source
[Proto]::Display($value)

# 実行はおしまい
Write-Host "おしまい"

実行するC#のコードはこんな感じ。
今回はメソッドをすぐに呼びたかったのでstaticにしといた。

using System;

/// <summary>
/// サンプルで作ったクラスの定義
/// </summary>
public class Proto
{
	/// <summary>
	/// 引数で受け取った文字列をコンソールに表示する
	/// </summary>
	/// <param name="value">表示する文字列</param>
	public static void Display(string value)
	{
		Console.WriteLine(value);
	}
}

PowerShellのスクリプトを実行するときはこんな感じ。
とりあえず、スクリプトの引数をC#のコードに渡すようにしてる。

powershell -ExecutionPolicy Bypass -File Proto.ps1 -value "バッチファイルで指定した表示する文字列"

実行してみたらこんな感じ。
ちゃんと引数で指定した文字列がC#のコードに渡されて文字列が表示されとる。

バッチファイルで指定した表示する文字列
おしまい

試してみたので、メモっとく事に。