当一个列表可能只是Get-Item中的一个项目时,如何在PowerShell中合并两个“列表”?

问题描述 投票:2回答:3

我正在使用Get-ChildItem来获取本地安装的证书。然后我想从我的本地证书库中删除这些证书。如果我执行下面的脚本,当两个Get-ChildItem查询中都返回了多个项时,它将起作用。但是,如果在任一查询中只返回一个项目,则添加两个集合将失败。仅仅因为只返回一个对象,实现只返回一个实例,而不是一个实例的集合。这里的正确方法是什么?我不知道从我的查询返回的结果是否会产生0,1或多个证书。

$myCerts = Get-ChildItem cert:\CurrentUser\My | Where-Object { $_.Subject -like "CN=$certName" }
$trustedPeopleCerts = Get-ChildItem cert:\CurrentUser\TrustedPeople | Where-Object { $_.Subject -like "CN=$certName" }

$allCerts = $myCerts + $trustedPeopleCerts

foreach ($cert in $allCerts) {
    $store = Get-Item $cert.PSParentPath
    $store.Open('ReadWrite')
    $store.Remove($cert)
    $store.Close()
}
powershell get-childitem
3个回答
6
投票

如果$myCerts可能只是一个项目,请使用数组子表达式运算符@( )

$allCerts = @($myCerts) + $trustedPeopleCerts

2
投票

完成同样事情的另一个解决方案是使用unary comma operator来确保$myCerts始终是一个数组。考虑以下用于一个元素和0个元素的示例。

$myCerts = Get-Item C:\temp
$myCerts.GetType().FullName

$myCerts = $null
$myCerts.GetType().FullName

以上将生成System.IO.DirectoryInfo和“调用一个关于空值表达式的方法”的错误

现在让我们用一元逗号运算符尝试相同的事情。

$myCerts = ,(Get-Item C:\temp)
$myCerts = ,($null)

两个案例的答案都是System.Object[]

我忘记了这件事情。在这种情况下,@()可能是优先的,因为它是一个数组子表达式。我认为这里的逗号运算符正在创建一个多维数组。当在管道中使用时,它会展开,您仍然可以获得您正在寻找的数据,但这是一个重要的区别。


0
投票

我发现了一种使用管道的方法,以防数组不能很好地运行。这会将每个项目写入ScriptBlock内的本地管道,该管道将被捕获到变量中。

$merged = & {
    $foo
    $bar
}
© www.soinside.com 2019 - 2024. All rights reserved.