Powershell:使用if条件导入csv

Powershell:使用if条件导入csv,powershell,import-csv,Powershell,Import Csv,我有一个csv,如下所示: 服务器操作系统热修复ID 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) { G

我有一个csv,如下所示:

  • 服务器操作系统热修复ID
  • 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)
}

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


假设我理解您的任务正确,您应该迭代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
        }
    }
}

假设我理解您的任务正确,您应该迭代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
        }
    }
}

您有多个带有
Win12
的条目,因此
$Win12
PSCustomObject
的数组。使用
($Win12.Source)
时,它将输出所有源的数组。(
Comp1,Comp1
Get Hotfix
接受此数组并使用每个源测试
$Win12.Hotfix ID
(也是一个数组)。这就是为什么每个项目在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)
    }

}

但是的代码更干净,并且也更干净。

您有多个带有Win12的条目,因此$Win12PSCustomObject的数组。使用
($Win12.Source)
时,它将输出所有源的数组。(
Comp1,Comp1
Get Hotfix
接受此数组并使用每个源测试
$Win12.Hotfix ID
(也是一个数组)。这就是为什么每个项目在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)
    }

}

但是,的代码更干净,并且做的也一样。

我有点困惑。您的示例数据似乎只引用了1台Win12服务器-“Comp1”。你想只检查每台远程计算机的一个特定的hotfix ID吗?我有点困惑。您的示例数据似乎只引用了1台Win12服务器-“Comp1”。您想只检查每台远程计算机的一个特定HotfixID吗?我自己也解释得再清楚不过了。非常感谢。我自己也解释得再清楚不过了。非常感谢你。