我正在使用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()
}
如果$myCerts
可能只是一个项目,请使用数组子表达式运算符@( )
:
$allCerts = @($myCerts) + $trustedPeopleCerts
完成同样事情的另一个解决方案是使用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[]
我忘记了这件事情。在这种情况下,@()
可能是优先的,因为它是一个数组子表达式。我认为这里的逗号运算符正在创建一个多维数组。当在管道中使用时,它会展开,您仍然可以获得您正在寻找的数据,但这是一个重要的区别。
我发现了一种使用管道的方法,以防数组不能很好地运行。这会将每个项目写入ScriptBlock
内的本地管道,该管道将被捕获到变量中。
$merged = & {
$foo
$bar
}