我有大约 200 台服务器,我需要获取磁盘空间和逻辑驱动器空间详细信息(可用空间、已用空间和总空间)。
这是我的 PowerShell 查询。
$infoObjects = New-Object PSObject
foreach ($machine in $servers) {
$counts = Get-WmiObject -Query "SELECT * FROM Win32_DiskDrive" -ComputerName $machine
$total_disk = @($counts).Count
$i = 0
$total_disk = $total_disk -1
for (; $i -le $total_disk; $i++) {
$a = $i
$a = Get-WmiObject -Query "SELECT * FROM Win32_DiskDrive WHERE DeviceID='\\\\.\\PHYSICALDRIVE$i'" -ComputerName $machine
$b = $i
$b = [math]::round($a.size /1GB)
Add-Member -InputObject $infoObject -MemberType NoteProperty -Name "Physical_Disk $i" -Value $b
}
$infoObject | Export-Csv -Path Inventory.csv -Append -Force -NoTypeInformation
}
它为我提供了所需的输出,但如果某些服务器具有多个磁盘或具有比输出更多的逻辑驱动器,则输出会停留在第一台服务器的驱动器数量上。它没有在其他服务器的其余驱动器的 CSV 文件中提供输出。
这是我所说的例子。
ServerName Physical_Disk 0 Physical_Disk 1 Physical_Disk 2 Physical_Disk 3
Server1 100 20 40
Server2 85
Server3 60 450 200 420
Server4 60
Server5 60
Server10 55 20 40
如果看起来我无法解释这个问题。让我再尝试一次。
- 第一台服务器有 2 个物理驱动器,这些驱动器将出现在我的输出文件 (CSV) 中。
- 第二台服务器还有 2 个物理驱动器,它们也位于 CSV 文件中。
- 但第三台服务器有超过 2 个驱动器,但输出中仅显示 2 个驱动器。
Export-Csv
假设列表中的所有对象都是统一的,即它们都具有相同的属性,只是具有不同的值。它使用第一个元素的属性来确定要导出的内容。要么确保所有对象具有相同的属性,要么使用不同的输出方法,例如将所有磁盘信息放入每个主机的数组中并将其写入输出文件,例如像这样:
foreach ($machine in $servers) {
$disks = @($machine)
$disks += Get-WmiObject -Computer $machine -Class Win32_DiskDrive |
ForEach-Object { [Math]::Round($_.Size/1GB) }
$disks -join ',' | Add-Content 'C:\path\to\output.csv'
}
顺便说一句,您不需要多个 WMI 查询,因为第一个查询已经返回所有磁盘,包括其大小。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)