以下のコードは2つの「同一の」ハッシュテーブルを生成しますが、コードブロックを使用してグループ化されたものでは、キーからアイテムを取得できません。
$HashTableWithoutBlock =
Get-WmiObject Win32_Service | Group-Object State -AsHashTable
$HashTableWithBlock =
Get-WmiObject Win32_Service | Group-Object {$_.State} -AsHashTable
Write-Host "Search result for HashTable without using code block : " -NoNewline
if($HashTableWithoutBlock["Stopped"] -eq $null)
{
Write-Host "Failed"
}
else
{
Write-Host "Success"
}
Write-Host "Search result for HashTable with code block : " -NoNewline
if($HashTableWithBlock["Stopped"] -eq $null)
{
Write-Host "Failed"
}
else
{
Write-Host "Success"
}
出力:
Search result for HashTable without using code block : Success
Search result for HashTable with code block : Failed
2つのハッシュテーブルの違いは何ですか?
コードブロックでグループ化された2番目のアイテムを取得するにはどうすればよいですか?
編集:回避策以上に、テーブルルックアップで必要なアイテムを取得できるかどうかを知りたいのですが、可能であれば、どのようにしたらよいですか?
2つHashtable
のの違い$HashTableWithBlock
は、キーがでラップされていることPSObject
です。問題は、PowerShellは通常PSObject
、メソッド呼び出しに渡す前にアンラップするため、正しいキーを持っていても、それをインデクサーに渡すことはできないということです。これを回避するために、適切なオブジェクトでインデクサーを呼び出すヘルパーC#メソッドを作成できます。別の方法は、リフレクションを使用することです。
Add-Type -TypeDefinition @'
public static class Helper {
public static object IndexHashtableByPSObject(System.Collections.IDictionary table,object[] key) {
return table[key[0]];
}
}
'@
$HashTableWithBlock = Get-WmiObject Win32_Service | Group-Object {$_.State} -AsHashTable
$Key=$HashTableWithBlock.Keys-eq'Stopped'
#Helper method
[Helper]::IndexHashtableByPSObject($HashTableWithBlock,$Key)
#Reflection
[Collections.IDictionary].InvokeMember('','GetProperty',$null,$HashTableWithBlock,$Key)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加