tech.guitarrapc.cóm

Technical updates

PowerShellで 動的にPropertyにアクセスする

前回の補足というか、PowerShell 3.0での動的なPropertyアクセスの方法例を紹介します。 今回紹介するのは、その変数に含まれるプロパティに順にアクセスして結果を表示したり、操作したりする例です。 実際、運用でも利用しているコードですので参考になればです。 ※なお、本コードは PowerShell 3.0 以降でのみ動作します。

プロパティを取得する

要は、プロパティの一覧を取得して、順にアクセスすればいいわけです。 簡単ですね、Get-Memberで一発です。
$path = Get-ChildItem -Path c:\
$propaties = $path | Get-Member -MemberType Properties | select -ExpandProperty Name
これで、$properties変数には、$pathのptopertyやNotePropertyが入りました。

プロパティにアクセスする

では順にプロパティにアクセスしてみましょう。
foreach ($p in $propaies)
{
	Write-Host $p -ForegroundColor Cyan
	$path.$p | Format-Table -AutoSize
	""
}
結果、各プロパティの内容を表示できます。
Mode
d----
d----
d----
d-r--
d-r--
d----
d-r--
d----
-a---
-a---

PSChildName
downloads
inetpub
PerfLogs
Program Files
Program Files (x86)
sources
Users
Windows
RAMDisk.img
RAMDisk.img.bak

PSDrive

Name Used (GB) Free (GB) Provider   Root  CurrentLocation
---- --------- --------- --------   ----  ---------------
C        73.29     38.49 FileSystem C:\  Windows\system32
C        73.29     38.49 FileSystem C:\  Windows\system32
C        73.29     38.49 FileSystem C:\  Windows\system32
C        73.29     38.49 FileSystem C:\  Windows\system32
C        73.29     38.49 FileSystem C:\  Windows\system32
C        73.29     38.49 FileSystem C:\  Windows\system32
C        73.29     38.49 FileSystem C:\  Windows\system32
C        73.29     38.49 FileSystem C:\  Windows\system32
C        73.29     38.49 FileSystem C:\  Windows\system32
C        73.29     38.49 FileSystem C:\  Windows\system32



PSIsContainer
True
True
True
True
True
True
True
True
False
False

PSParentPath
Microsoft.PowerShell.Core\FileSystem::C:\
Microsoft.PowerShell.Core\FileSystem::C:\
Microsoft.PowerShell.Core\FileSystem::C:\
Microsoft.PowerShell.Core\FileSystem::C:\
Microsoft.PowerShell.Core\FileSystem::C:\
Microsoft.PowerShell.Core\FileSystem::C:\
Microsoft.PowerShell.Core\FileSystem::C:\
Microsoft.PowerShell.Core\FileSystem::C:\
Microsoft.PowerShell.Core\FileSystem::C:\
Microsoft.PowerShell.Core\FileSystem::C:\

プロパティ毎に操作してみる

このやり方なら、予め作っておいたオブジェクトの名称毎にModule Direcotryを作ったりも簡単ですね。
$Users = [PSCustomObject]@{
	hoge="hoge"
	fuga="fuga"
	foo="foo"
}

$prop = $Users | Get-Member -MemberType Properties

foreach ($p in $prop)
{
	$PSModulePath = "C:\Users\$($Users.$p)\Documents\WindowsPowerShell\Modules"
	if (-not(Test-Path $PSModulePath))
	{
		Write-Verbose "Create Module path"
		New-Item -Path $PSModulePath -ItemType Directory -Force
	}
	else
	{
		Write-Verbose " $PSModulePath already exist. Nothing had changed. `n"
	}
}
もちろんUserはCIMから取得してもいいでしょう。 この辺はお好きにさじ加減を。 この辺が楽にかけて調整できる、PowerShell っていいですよね!