我尝试导入csv文件,针对csv文件中的计算机名运行序列号搜索,并将计算机名称和序列号组合导出到新的csv文件。这就是我迄今为止所做的事情并没有像我预期的那样发挥作用(对于PowerShell来说还是新手)。
$csv = Import-CSV "C:\Computer_Name_CSV_Generator.csv"
$resultsarray = @()
$wmiresults = New-Object PSCustomObject
$wmiresults | Add-Member -type NoteProperty -Name Computer_Name -Value $Computer_Name.Computer_Name
$wmiresults | Add-Member -type NoteProperty -Name SerialNumber -Value $getwmiSN
Foreach ($Computer_Name in $csv)
{
If ($Computer_Name.Computer_Name -ne 0)
{
$getwmiSN = Get-WmiObject -ComputerName $Computer_Name.Computer_Name win32_bios | Select-object SerialNumber
$wmiresults.Computer_Name = $Computer_Name.Computer_Name
$wmiresults.SerialNumber = $getwmiSN.SerialNumber
}
$resultsarray += $wmiresults
}
$resultsarray | Export-Csv "C:\ComputerSerialNumbers.csv" -NoTypeInformation -Encoding UTF8
每次在foreach结束时更新数组时,所有数据都会被修改为最后一个机器/序列号的数据通过foreach运行。当它被导出时,我会收到一个完全由最后一个计算机名和序列号组成的csv,但输入的数量恰好与导入csv相同。
If语句用于处理原始csv中导致0的空白行。
答案 0 :(得分:1)
您需要为每台计算机创建一个对象,而不是一遍又一遍地修改该对象。尝试:
$csv = Import-CSV "C:\Computer_Name_CSV_Generator.csv"
$resultsarray = @()
Foreach ($Computer_Name in $csv)
{
If ($Computer_Name.Computer_Name -ne 0)
{
$getwmiSN = Get-WmiObject -ComputerName $Computer_Name.Computer_Name win32_bios
$wmiresults = New-Object PSCustomObject -Property @{
"Computer_Name" = $Computer_Name.Computer_Name
"SerialNumber" = $getwmiSN.SerialNumber
}
$resultsarray += $wmiresults
}
}
$resultsarray | Export-Csv "C:\ComputerSerialNumbers.csv" -NoTypeInformation -Encoding UTF8
您还可以简化它以使用PowerShell中的管道支持。这样你就可以将它缩短为:
Import-CSV "C:\Computer_Name_CSV_Generator.csv" |
ForEach-Object {
if($_.Computer_Name -ne 0) {
$getwmiSN = Get-WmiObject -ComputerName $_.Computer_Name win32_bios
New-Object PSCustomObject -Property @{
"Computer_Name" = $_.Computer_Name
"SerialNumber" = $getwmiSN.SerialNumber
}
}
} | Export-Csv "C:\ComputerSerialNumbers.csv" -NoTypeInformation -Encoding UTF8