【问题标题】:Powershell : import-csv with if conditionPowershell:带有if条件的import-csv
【发布时间】:2020-01-03 13:59:06
【问题描述】:

我有一个 csv 如下:

  • 服务器操作系统 HotFixID
  • Comp1 Win12 KB452
  • Comp1 Win12 KB453
  • svrname3 Win8 KB134

我在下面编写了用于检查操作系统的脚本,如果它匹配,那么它应该检查服务器是否具有相同的 HotfixID。

$file = Import-Csv .\Desktop\hotfix.csv
if($Win12 = $file | where {$_.os -eq "Win12"} | select Source, HotFixID)
{
Get-HotFix -ComputerName ($Win12.Source) -Id ($Win12.HotFixID)
}
else
{
$Win8 = $file | where {$_.os -eq "Win8"} | select Source, HotFixID
Get-HotFix -ComputerName ($Win8.Source) -Id ($Win8.HotFixID)
}

问题在于输出。我在 csv 中有 2 个 Win12 服务器,但我得到 4 个输出 2 作为重复。我能够理解这里有一个嵌套循环正在运行但无法纠正它。请!!让我知道如何解决这个问题。

【问题讨论】:

  • 我有点困惑。您的示例数据似乎只引用了 1 个 Win12 服务器 - “Comp1”。您是否只想检查每台远程计算机的 1 个特定 HotfixID?

标签: powershell import-csv


【解决方案1】:

假设我理解您的任务是正确的,您应该遍历 CSV 文件中的所有元素并单独检查每个项目。

$CSVList = Import-Csv .\Desktop\hotfix.csv
foreach ($CSVItem in $CSVList) {
    if ($CSVItem.os -eq 'Win12' -or $CSVItem.os -eq 'Win8') {
        if (Test-Connection -ComputerName $CSVItem.Source) {
            Get-HotFix -ComputerName $CSVItem.Source -Id $CSVItem.HotFixID
        }
    }
}

【讨论】:

    【解决方案2】:

    您有多个带有Win12 的条目,因此$Win12PSCustomObject 的数组。当您使用($Win12.Source) 时,它将输出所有来源的数组。 (Comp1,Comp1)。 Get-Hotfix 接受这个数组并用每个源测试$Win12.HotFixID(也是一个数组)。这就是您获得每个项目在 CSV 中出现的次数的原因。为避免这种情况,请自行处理 CSV 中的每一行。如果你想保持你的结构,你的代码应该是这样的:

    if($Win12 = $file | where {$_.os -eq "Win12"} | select Source, HotFixID)
    {
        $Win12 | foreach {
            Get-HotFix -ComputerName ($_.Source) -Id ($_.HotFixID)
        }
    }
    else
    {
        $Win8 = $file | where {$_.os -eq "Win8"} | select Source, HotFixID
        $Win8 | foreach {
            Get-HotFix -ComputerName ($_.Source) -Id ($_.HotFixID)
        }
    
    }
    

    但是Olaf 的代码更简洁,并且作用相同。

    【讨论】:

    • 我自己无法更好地解释它。非常感谢。
    猜你喜欢
    • 2017-01-20
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多