问题描述
我需要创建一个脚本来检查我们网络内主机的可用和已用存储。将主机加载到阵列中,然后在PowerShell中显示具有可用空间和大小的磁盘。 现在,我希望将所有这些内容导出到一个csv文件中,以便您可以更轻松地分析数据。
这是脚本:
$servers = @("server1","server2","server3")
Foreach ($server in $servers)
{
$disks = Get-WmiObject Win32_Logicaldisk -ComputerName $server -Filter DriveType=3 |
Select-Object deviceid,@{'Name'='Size'; 'Expression'={[math]::truncate($_.size / 1GB)}},@{'Name'='Freespace'; 'Expression'={[math]::truncate($_.freespace / 1GB)}}
$server
foreach ($disk in $disks)
{
$disk.deviceid + $disk.FreeSpace.ToString("N0") + "GB / " + $disk.Size.ToString("N0") + "GB"
}
}
Thx btw:)
解决方法
您将希望将服务器名称“胶粘”到每个关联的$server
对象上,而不是尝试通过手动输出$disk
值来控制输出格式,这将使操作起来更加容易导出为CSV(使用正确的服务器名称):
$servers = @("server1","server2","server3")
$allDisks = foreach ($server in $servers)
{
# Instead of assigning to `$disks` inside the loop,# we let the output from all loop executions "bubble up"
# to the assignment to `$allDisks`
Get-WmiObject Win32_LogicalDisk -ComputerName $server -Filter DriveType=3 |
Select-Object @{'Name'='ComputerName'; 'Expression'={$server}},DeviceID,@{'Name'='Size'; 'Expression'={[math]::truncate($_.size / 1GB)}},@{'Name'='Freespace'; 'Expression'={[math]::truncate($_.freespace / 1GB)}}
}
现在每个对象都附加了正确的服务器名称,我们可以轻松导出到CSV:
$allDisks |Export-Csv .\path\to\output.csv -NoTypeInformation
...,我们还可以使用PowerShell的本机格式子系统在交互式shell中很好地处理输出:
$allDisks |Format-Table DeviceID,Size,FreeSpace -GroupBy ComputerName