Powershell |分析已使用和免费存储服务器并将其导出到CSV的脚本

问题描述

我需要创建一个脚本来检查我们网络内主机的可用和已用存储。将主机加载到阵列中,然后在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