使用管道或其他类型的内联表示法,我想“选择”哈希表中的某些值直接到达结果,同时更改或设置其他值。
哈希表
我从一个哈希表开始(坦率地说,它像一个对象一样使用),如下所示:
>$hash
Name Value
---- -----
System server-1
Job Microsoft.PowerShell.Commands.PSWmiJob
Result
有没有办法使用 Select-Object cmdlet(或类似的东西)来设置某些属性的值并传递其他属性?我想以这样的方式结束:
>$hash
Name Value
---- -----
System server-1
Job Microsoft.PowerShell.Commands.PSWmiJob
Result Good
如果我不需要/不希望它内联,我只需设置 Result
的值:
$hash.Result = "good"
对于内联解决方案,我总是可以像这样使用 Foreach-Object
:
$hash | Foreach-Object {@{System=$_.System;Job=$_.Job;Result="Good"}}
或者直接在子表达式中引用 $hash:
${@{System=$hash.System;Job=$hash.Job;Result="Good"}}
但是,当我只处理一个哈希表时,使用 Foreach-Object
似乎是无意义的,并且两次提及我只想传递的属性非常冗长,然后可以如果我的 $hash
变量是 $aSignificantlyLongerHashTableVariableName
,那么会很笨重。
如果我使用的是 Powershell 对象...
如果我使用这样的对象:
>$obj
System Job Result
------ --- ---
server-1 Microsoft.PowerShell.Commands.PSWmiJob
我将使用 select-object
Cmdlet,如下所示:
>$obj | Select-Object System, Job, @{Name="Result";Expression="Good"}
这会导致
>$obj
System Job Result
------ --- ---
server-1 Microsoft.PowerShell.Commands.PSWmiJob Good
Hashtable 和 PSObject 有一些相似的方面(以命名方式包含其他内容的东西),但据我所知,它们是不兼容的 - 对于我来说,是否有更接近 Select-Object
的替代方案我想在这里做什么?
最佳答案
严格要求将其作为单行代码,事先没有设置代码并且不会修改源哈希,这样的东西可以完成这项工作:
($hash + @{ 'Result' = 'Good' }).GetEnumerator() | ? {$_.Key -in 'Result','System','Job'}
如果您要定期添加一些Result = Good
,保存您的小扩展位可能会很方便:
$good = @{ 'Result' = 'Good' }
然后你的一句台词就变成了:
($hash + $good).GetEnumerator() | ? {$_.Key -in 'Result','System','Job'}
编辑:正如您在下面的评论中所指出的,如果哈希中存在Result
,那么单行代码将会消失。此版本更安全/更明确,并且更直接地映射到您在 PSObjects 上使用 Select-Object
描述的精神:
(($hash).GetEnumerator() | ? {$_.Key -in 'System','Job'}) + @{'Result' = 'Good'}
虽然还不是世界上最漂亮的东西,但它已经完成了工作。
关于powershell - 如何在 powershell 脚本中选择某些哈希表值但更改其他内联值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35775848/