tech.guitarrapc.cóm

Technical updates

PowerShellでPSCustomObjectに複数のObjectを追加する

しれっとこれまで出してたんですが、一応まとめておきます。 PSCustomObject は PowerShell 3.0 から追加された、 新たに PSObject を定義するための簡潔に利用できる型です。 詳しくはWeb でということで、表題のやり方の一例を。

PSCustomObjectを作ってみる

連想配列の頭に [PSCustomObject] と型名漬けてあげるだけです。 簡単!便利!正義ですね。 例えば、このような連想配列があります。
@{
	ContextMenus = "Open Windows PowerShellx64 as Administrator"
	commands = "$PSHOME\powershell.exe -NoExit -NoProfile -Command ""Set-Location '%V'"""
	versions = "PowerShellx64"
}
これでは、あくまで連想配列で出るのです。
Name                           Value
----                           -----
commands                       C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -NoExit -NoProfile -Command "Set-Location '%V'"
ContextMenus                   Open Windows PowerShellx64 as Administrator
versions                       PowerShellx64
しかし、頭に [PSCustomObject] とつけるだけで新たな PSObject が定義できます。
[PSCustomObject]@{
	ContextMenus = "Open Windows PowerShellx64 as Administrator"
	commands = "$PSHOME\powershell.exe -NoExit -NoProfile -Command ""Set-Location '%V'"""
	versions = "PowerShellx64"
}
簡単。
ContextMenus                                                   commands                                                       versions
------------                                                   --------                                                       --------
Open Windows PowerShellx86 as Administrator                    c:\Windows\syswow64\powershell.exe -NoExit -NoProfile -Comm... PowerShellx86

PSCustomObjectに複数のオブジェクトを設定する

+ は使えません。 (そりゃそーだ 要は、同じセッション内で当て込んであげればいいのです。 つまり、もとの値 (例えば配列) を Foreach-Object で渡すなどです。 例えば、このような2次元配列を考えてみます。
@(
	@(
		'Open Windows PowerShellx86 as Administrator',
		"c:\Windows\syswow64\powershell.exe -NoExit -NoProfile -Command ""Set-Location '%V'""",
		"PowerShellx86"
	),
	@(
		'Open Windows PowerShellx64 as Administrator',
		"$PSHOME\powershell.exe -NoExit -NoProfile -Command ""Set-Location '%V'""",
		"PowerShellx64"
	)
)
これをそれぞれのindexに合わせて次のように当てたいとすると
[PSCustomObject]@{
	ContextMenus = [0]
	commands = [1]
	versions = [2]
}
こんな簡単ですね。
@(
	@(
		'Open Windows PowerShellx86 as Administrator',
		"c:\Windows\syswow64\powershell.exe -NoExit -NoProfile -Command ""Set-Location '%V'""",
		"PowerShellx86"
	),
	@(
		'Open Windows PowerShellx64 as Administrator',
		"$PSHOME\powershell.exe -NoExit -NoProfile -Command ""Set-Location '%V'""",
		"PowerShellx64"
	)
) | %{
	[PSCustomObject]@{
		ContextMenus = $_[0]
		commands = $_[1]
		versions = $_[2]
	}
}
ででん
ContextMenus                                                   commands                                                       versions
------------                                                   --------                                                       --------
Open Windows PowerShellx86 as Administrator                    c:\Windows\syswow64\powershell.exe -NoExit -NoProfile -Comm... PowerShellx86
Open Windows PowerShellx64 as Administrator                    C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -... PowerShellx64
もちろん配列でなくてもいいので、自在に Cmdlet結果をパイプで受けて 元データをいじった PSObjectを作れます。 上手く使って、 Select-Object @{Name="";Expression={}} から卒業できるといいですね!