Отчет о дисковом пространстве на удаленном компьютере - PullRequest
1 голос
/ 06 июля 2019

Вот мой код для сбора дискового пространства для всех удаленных дисков:

$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 ]

2 голосов
/ 06 июля 2019

Как отмечается в комментарии @ Lee_Daily, вы можете использовать командлет Group-Object для создания уникальной группы для каждого 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 можно найти здесь .

Надеюсь, это поможет.

1 голос
/ 07 июля 2019

здесь несколько иной подход.требуется, чтобы вы завернули следующий код в блок скриптов и затем использовали 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...*]
...