powershell - 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
}
}
解决方案
继续我的评论。. . 照原样,您会将结果导出到远程机器。那就是如果它被正确地管道。您目前缺少一个管道 ( |
) 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
}
}
还:
- 永远记住,即使您可以 ping 一台机器,也不意味着您可以连接到它。
- 这可以通过使用CIM Session或PSSession来缓解,具体取决于您正在运行的命令类型。
推荐阅读
- php - Laravel 全局助手 vs php 助手
- javascript - 错误:必须在 google.charts.setOnLoadCallback 之前调用 google.charts.load
- python - Django Models,表中有列,但是不能从这部分查询中引用,
- github-actions - 如何缓存依赖项安装?
- rust - 如何在 Rust 编译的二进制文件中包含文件内容?
- typescript - 我应该在哪里以及如何在passportjs中检查访问令牌的有效性
- scala - 在火花数据框中找不到值 &&:比较空值时
- python-3.x - 在 UDP (python) 中实现可靠性
- ansible - 无法获取产品版本。如何使用 ansible 设置 CLASSPATH
- php - 在php中从长字符串中提取特定字符串