gpt4 book ai didi

powershell - 有或没有代码块的组对象差异

转载 作者:行者123 更新时间:2023-12-03 12:27:09 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Group-Object, get counts

(2 个回答)


5个月前关闭。




下面的代码生成 2 个“相同”的哈希表,但是在使用代码块分组的那个上,我无法从 key 中获取项目。

$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

这两个哈希表有什么区别?

如何获取按代码块分组的第二个项目?

编辑:不仅仅是一种解决方法,我想知道是否可以使用表格 检索我想要的项目查找 ,如果是,如何?

最佳答案

两者的区别Hashtable s 是 $HashTableWithBlock将其 key 包裹在 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)

关于powershell - 有或没有代码块的组对象差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28190053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com