Powershell:使用if条件导入csv
我有一个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
- 服务器操作系统热修复ID
- Comp1 Win12 KB452
- Comp1 Win12 KB453
- svrname3 Win8 KB134
$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
的条目,因此$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)
}
}
但是,的代码更干净,并且做的也一样。我有点困惑。您的示例数据似乎只引用了1台Win12服务器-“Comp1”。你想只检查每台远程计算机的一个特定的hotfix ID吗?我有点困惑。您的示例数据似乎只引用了1台Win12服务器-“Comp1”。您想只检查每台远程计算机的一个特定HotfixID吗?我自己也解释得再清楚不过了。非常感谢。我自己也解释得再清楚不过了。非常感谢你。