首页 > 解决方案 > 如何在 PowerShell 的远程连接中正确地将管道值映射到 ForEach-Object

问题描述

我有下一个代码:

$Dom = Get-ADDomain 
$DomIs = $dom.DNsRoot
$GetComp = Get-ADComputer -Filter 'enabled -eq "true"'

$CertGridComp = ($Computer | ForEach-Object {
        Invoke-Command -Cn $GetComp.Name -ScriptBlock {
        Get-ChildItem -Path Cert:LocalMachine\* -Recurse | 
        Select-Object PSComputerName, NotAfter, Issuer, NotBefore, Subject,PSPath
        }
       )| Out-GridView -Title  "Select Certificates to Delete" -PassThru

$Compdel | ForEach-Object {
    Invoke-Command -Cn $CertGridComp.PSComputerName {Remove-Item -path $Using:CertGridComp.PSPath -whatif}
 }

我需要从 OGV 传递映射值选择以执行正确删除。选择后使用上面的代码,我有一个问题,每个

CertGridComp.PSPath

值被传递给每个选择,从而使输出相乘,但也会给出错误,因为并非每个证书路径都存在于所选计算机上。如何格式化 ForEach-Object 以调用所选计算机的命令以仅使用其自己的证书路径,而不是选择的其他路径。

谢谢。

标签: powershell

解决方案


不知道从哪里来$Compdel。也就是说,我会做一些假设。

  1. 您最终可能会在每台机器上获得多个证书
  2. 您可能不想在每台机器上调用多个 Invoke-Command
  3. $CertGridComp已经包含您需要的所有信息。

基于这些,我会将您更改Invoke-Command为此。

$CertGridComp | Group-Object -Property pscomputername | foreach {
    Invoke-Command -cn $_.name -ScriptBlock {$using:_.group.pspath | foreach {Remove-Item -path $_ -WhatIf}}
}

首先,我们按 pscomputername 对每个条目进行分组。然后我们为每个组的名称调用一个invoke-command 调用,即PC 名称。接下来我们仍然使用$using但反对自动变量$_,这使它看起来有点奇怪。我们为每个要删除的证书提供了每个路径(即使它只是一个)。这应该可以完成您想要的。

编辑:我也看到了 Andrew 所指的内容$Computer——奇怪的是,该命令有效,但那部分是不必要的。这基本上是实际运行的。

$CertGridComp = Invoke-Command -Cn $GetComp.Name -ScriptBlock {
                    Get-ChildItem -Path Cert:LocalMachine\* -Recurse
                } | Select-Object PSComputerName, NotAfter, Issuer, NotBefore, Subject,PSPath |
                        Out-GridView -Title  "Select Certificates to Delete" -PassThru

重新格式化,整个脚本可能看起来像这样

$DomIs = (Get-ADDomain).DNsRoot
$GetComp = Get-ADComputer -Filter "enabled -eq 'true'"

Invoke-Command -Cn $GetComp.Name -ScriptBlock {
    Get-ChildItem -Path Cert:LocalMachine\* -Recurse
} | Select-Object PSComputerName, NotAfter, Issuer, NotBefore, Subject,PSPath |
        Out-GridView -Title  "Select Certificates to Delete" -PassThru -OutVariable CertGridComp

$CertGridComp | Group-Object -Property pscomputername | foreach {
    Invoke-Command -cn $_.name -ScriptBlock {$using:_.group.pspath | foreach {Remove-Item -path $_ -WhatIf}}
}

推荐阅读