这是我的代码,用于收集所有远程驱动器的磁盘空间:
$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)}}
然后我得到...
我想安排输出,因此每台机器在左侧列出一次,并且驱动器在顶部的列中:
有人知道吗?
答案 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...*]