首页 > 解决方案 > Powershell - 正确导出 CSV 文件

问题描述

我希望有人可以帮助我。我们想看看哪些计算机有 HDD 和 SDD。我有一个 excel.csv 的计算机。我进口电脑。但是当我导出它们时,我从来没有看到 csv 或它不完整。你能告诉我脚本的哪一部分不正确。谢谢

$computers = Import-csv -path "C:\Temp\MediaType\Computers.csv" 
foreach ($computer in $computers) { 
    Write-Host "`nPulling Physical Drive(s) for $computer"
    if((Test-Connection -BufferSize 32 -Count 1 -ComputerName $computer -Quiet)){ 
        Invoke-Command -ComputerName $computer -ScriptBlock { 
            Get-WmiObject -Class MSFT_PhysicalDisk -Namespace root\Microsoft\Windows\Storage | Select-Object sort -Property PSComputerName, Model, SerialNumber, MediaType
            Export-Csv C:\Temp\devices.csv
        }
    }
}

更新:2021 年 11 月 11 日谢谢大家的帮助这个脚本对我有用:

$ExportTo = "C:\Temp\devices.csv"
$computers = Import-csv -path "C:\Temp\Computers.csv"
{} | Select "ComputerName", "Status", "Model", "SerialNumber", "MediaType" | Export-Csv $ExportTo
$data = Import-csv -path $ExportTo 
foreach ($computer in $computers) {
$Online = Test-Connection -BufferSize 32 -Count 1 -ComputerName $computer.computer -Quiet
if ($Online) {
Write-Host $computer.computer " is Online"
$OutputMessage = Get-CimInstance -ClassName MSFT_PhysicalDisk -Namespace root\Microsoft\Windows\Storage -ComputerName $computer.computer | Select-Object -Property PSComputerName,@{N='Status';E={'Online'}}, Model, SerialNumber, MediaType
$data.ComputerName = $computer.computer
$data.Status = $OutputMessage.Status
$data.Model = $OutputMessage.Model
$data.SerialNumber = $OutputMessage.SerialNumber
$data.MediaType = $OutputMessage.MediaType
$data | Export-Csv -Path $ExportTo -Append -NoTypeInformation
} else {
Write-Host $computer.computer " is Offline"
$data.ComputerName = $computer.computer
$data.Status = "Offline"
$data.Model = ""
$data.SerialNumber = ""
$data.MediaType = ""
$data | Export-Csv -Path $ExportTo -Append -NoTypeInformation
}
}

标签: powershellexport

解决方案


继续我的评论。. . 照原样,您会将结果导出到远程机器。那就是如果它被正确地管道。您目前缺少一个管道 ( |) before Export-Csv

此外,不需要调用该命令,Get-WMIObject远程计算机的参数是:-ComputerName. 它也是一个已弃用的 cmdlet,已被Get-CimInstance取代。

$ExportTo  = "C:\Temp\devices.csv" 
$computers = Import-csv -path "C:\Temp\MediaType\Computers.csv" 
    foreach ($computer in $computers) 
    { 
        Write-Host "`nPulling Physical Drive(s) for $computer" 
        if (Test-Connection -BufferSize 32 -Count 1 -ComputerName $computer -Quiet) {
         
            Get-CimInstance -ClassName MSFT_PhysicalDisk -Namespace root\Microsoft\Windows\Storage -ComputerName $computer | 
                Select-Object -Property PSComputerName, Model, SerialNumber, MediaType | 
                Export-Csv -Path $ExportTo -Append -NoTypeInformation

        } 
    }

旁注Get-CimInstance接受一个字符串数组,这意味着您可以将全部传递$Computers给它。这应该允许它并行执行查询,而不是串行一次一个):

$ExportTo  = "C:\Temp\devices.csv" 
$computers = Import-csv -path "C:\Temp\MediaType\Computers.csv" 

Get-CimInstance -ClassName MSFT_PhysicalDisk -Namespace root\Microsoft\Windows\Storage -ComputerName $computers -ErrorAction SilentlyContinue | 
    Select-Object -Property PSComputerName, Model, SerialNumber, MediaType |
    Export-Csv -Path $ExportTo -Append -NoTypeInformation

一次执行一个查询并不一定意味着它很糟糕。您实际上可以更好地控制脚本的流程控制。

编辑: 跟进您的评论......您不再使用您的if声明在连接之前检查计算机是否在线。因此,如果您保留该if语句并添加else条件,您可以创建一个计算属性以添加另一个属性以导出Status。然后,您可以将值传递给它Online,或者Offline取决于机器是否在线:

$ExportTo  = "C:\Temp\devices.csv" 
$computers = Import-csv -path "C:\Temp\MediaType\Computers.csv" 
    foreach ($computer in $computers) 
    { 
        if (Test-Connection -BufferSize 32 -Count 1 -ComputerName $computer -Quiet) {
            Write-Host -Object "`nPulling Physical Drive(s) for $computer" 
            Get-CimInstance -ClassName MSFT_PhysicalDisk -Namespace root\Microsoft\Windows\Storage -ComputerName $computer | 
                Select-Object -Property PSComputerName,@{N='Status';E={'Online'}}, Model, SerialNumber, MediaType | 
                Export-Csv -Path $ExportTo -Append -NoTypeInformation -Force
        }
        else {
            Write-Host -Object "`n$Computer is Offline"
           [PSCustomObject]@{PSComputerName=$Computer;Status='Offline'} | Export-Csv -Path $ExportTo -Append -Force
        } 
    }

还:

  1. 永远记住,即使您可以 ping 一台机器,也不意味着您可以连接到它。
  2. 这可以通过使用CIM SessionPSSession来缓解,具体取决于您正在运行的命令类型。

推荐阅读