远程计算机磁盘空间报告

时间:2019-07-05 22:33:41

标签: powershell report diskspace

这是我的代码,用于收集所有远程驱动器的磁盘空间:

$Computers = (Get-ADComputer -Filter {(OperatingSystem -like "*windows*")}-Server $domain).dnshostname

$report1 = Get-WmiObject Win32_LogicalDisk -computer $computers -Credential $Creds | Select SystemName,DeviceID,VolumeName,@{Name="Size(GB)";Expression={"{0:N1}" -f($_.size/1gb)}},@{Name="FreeSpace(GB)";Expression={"{0:N1}" -f($_.freespace/1gb)}}

然后我得到...

enter image description here

我想安排输出,因此每台机器在左侧列出一次,并且驱动器在顶部的列中:

enter image description here

有人知道吗?

2 个答案:

答案 0 :(得分:2)

如@Lee_Daily的评论所述,您可以使用Group-Object cmdlet为每个SystemName创建一个唯一的组。下面的示例通过$report1属性对SystemName中的对象进行分组。 Group-Object返回一个GroupInfo对象(或GroupInfo的数组),在这里我们选择Group属性的内容(SystemName也包含在其中Group属性)。 Group属性是一个HashSet,可以通过ConvertTo-Csv进行转换。

 $peport1 | Group-Object SystemName | Select -ExpandProperty Group | ForEach-Object { $_ | ConvertTo-Csv  -NoTypeInformation }

您可以将ConvertTo-Csv替换为Export-Csv

 $peport1 | Group-Object SystemName | Select -ExpandProperty Group | ForEach-Object { $_ | Export-Csv "repor1.csv"  -NoTypeInformation -Append }

-Append将追加几行,其中每一行是GroupInfo数组的一项。

有关Group-Object cmdlet的文档可以在here中找到。

希望有帮助。

答案 1 :(得分:1)

这是有些不同的方法。它要求您将以下代码包装在脚本块中,然后使用Invoke-Command在目标系统上运行它。如果您无法正常工作,请让我知道... [咧嘴]

# if you have no locally mapped/subst-ed drive letters, remove this section
$SubstLocalDiskList = @(subst.exe |
    ForEach-Object {
        $_[0]
        })
$DiskList = Get-PSDrive -PSProvider FileSystem |
    Where-Object {
        # read-only drives will show "0" used & "0" free 
        $_.Free -gt 0 -and
        $_.Used -gt 0 -and
        # if you have no locally mapped/subst-ed drive letters, remove this line
        $_.Name -notin $SubstLocalDiskList
        }

$FreeWarning_Pct = 10
$TempPropTable = [ordered]@{
    ComputerName = $env:COMPUTERNAME
    }
foreach ($DL_Item in $DiskList)
    {
    $Size = $DL_Item.Used + $DL_Item.Free
    $SizeFree_Pct = [math]::Round($DL_Item.Free / $Size * 100, 2)
    if ($SizeFree_Pct -ge $FreeWarning_Pct)
        {
        $SFP_Status = 'OK'
        }
        else
        {
        $SFP_Status = '__ Low __'
        }

    $TempPropTable.Add('{0}_Drive' -f $DL_Item.Name, $DL_Item.Name)
    $TempPropTable.Add('{0}_Size_GB' -f $DL_Item.Name, [math]::Round($Size / 1GB, 2))
    $TempPropTable.Add('{0}_Free_Pct' -f $DL_Item.Name, $SizeFree_Pct)
    $TempPropTable.Add('{0}_SFP_Status' -f $DL_Item.Name, $SFP_Status)

    }

[PSCustomObject]$TempPropTable

一个系统的截断输出...

ComputerName C_Drive C_Size_GB C_Free_Pct C_SFP_Status D_Drive D_Size_GB D_Free_Pct D_SFP_Status E_Drive [*...snip...*] 
------------ ------- --------- ---------- ------------ ------- --------- ---------- ------------ ------- [*...snip...*] 
[MySysName]  C          931.41      79.22 OK           D          930.57      49.68 OK           E       [*...snip...*]