Adi*_*ilZ 2 powershell hash split hashtable
如何从特定键/值对开始拆分哈希表?
我有以下哈希表,只是更长:
Name Value ---- ----- Name Alpha Age 2 Position Trick Start date 01-01-31 End date Unknown Name Corax Age 21 Position Sneak Earnings 40'000 End Date Unknown Name Horus Age 22 Position Dead Why Heresy End date 03-30-30
我尝试Group-Object但失败了.
我特别想把它与名字分开,除名字,年龄和位置之外的一切都不一致.
我的实际问题是我想在为什么 = 异端时解析名称和年龄的哈希表,不幸的是,数据的原始来源是字符串列表,这就是我将其转换为哈希表的原因.
Hashtables没有订购,因此您不能依赖"之前"和"之后"的概念.如果您知道一组完整密钥的特定名称,那么您可以遍历哈希表并构建两个新密钥,因此如果您希望一个哈希表包含名称,年龄和位置,另一个哈希表包含其他所有内容,你可以这样做:
$New1 = @{}
$New2 = @{}
$KeysGroup1 = @('Name','Age','Position') # This could just be one value
$MyHashTable.GetEnumerator().ForEach({
if ($_.Key -in $KeysGroup1) {
$New1[$_.Key] = $_.Value
} else {
$New2[$_.Key] = $_.Value
}
})
Run Code Online (Sandbox Code Playgroud)
如果订单对您很重要,您可以使用有序字典.您可以使用快捷方式通过在文字哈希表前加上[ordered]类型加速器来创建文字有序字典:
$myOrdered = [ordered]@{ a = 1; z = 5; g = 2 }
Run Code Online (Sandbox Code Playgroud)
从那里你可以做一个类似于上面的方法依赖于订单.
要创建不基于文字的有序字典:
$myOrdered = New-Object System.Collections.Specialized.OrderedDictionary
# or in PowerShell v5
$myOrdered = [System.Collections.Specialized.OrderedDictionary]::new()
$myOrdered.Add('key','value')
Run Code Online (Sandbox Code Playgroud)
这听起来更像是一个散列表数组,你现在想要过滤这些.
一个[hashtable]can(并且经常)用作一种原型对象,它可能非常有用,因为它通常支持相同的语法,并且它具有内置的文字支持.
但是你开始遇到它们的极限,此时我认为你想要处理一组对象而不是一个哈希表数组.
幸运的是,有很简单的方法可以直接从散列表中创建PowerShell中的对象:
$obj = New-Object -TypeName PSObject -Property $myHash
$obj = [PSCustomObject]$myHash
$objArray = $myHashArray.ForEach({[PSCustomObject]$myHash})
Run Code Online (Sandbox Code Playgroud)
一旦你得到了你的对象数组,真正的乐趣就开始了:
$heretics = $objArray.Where({$_.Why -eq 'Heresy'})
Run Code Online (Sandbox Code Playgroud)
你会注意到我甚至没有在这里过滤掉其他属性.你不应该,直到你真的需要.然后,您可以使用Select-Object或只访问您需要的属性.因此,出于显示目的,您可能会这样做:
$heretics | Format-Table Name,Age
Run Code Online (Sandbox Code Playgroud)
你可以用一个你不能使用哈希表的对象做更多的事情,比如添加特殊类型的属性:
$objArray | Add-Member -MemberType ScriptProperty -Name IsHeretic -Value { $this.Why -eq 'Heresy' } -Force
$heretics = $objArray.Where({$_.IsHeretic})
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1283 次 |
| 最近记录: |