У меня около 200 серверов, и мне нужно получить данные о дисковом пространстве и пространстве логического диска (свободное пространство, используемое пространство и общее пространство).

Вот мой запрос PowerShell.

$infoObjects = New-Object PSObject
foreach ($machine in $servers) {
  $counts = Get-WmiObject -Query "SELECT * FROM Win32_DiskDrive" -ComputerName $machine
  $total_disk =  @($counts).Count
  $i = 0
  $total_disk = $total_disk -1

  for (; $i -le $total_disk; $i++) {
    $a = $i
    $a  = Get-WmiObject -Query "SELECT * FROM Win32_DiskDrive WHERE DeviceID='\\\\.\\PHYSICALDRIVE$i'" -ComputerName $machine

    $b = $i
    $b = [math]::round($a.size /1GB)

    Add-Member -InputObject $infoObject -MemberType NoteProperty -Name "Physical_Disk $i" -Value $b
  }
  $infoObject | Export-Csv -Path Inventory.csv -Append -Force -NoTypeInformation 
}

Это дает мне желаемый результат, но если некоторые из serverd имеют более одного диска или имеют больше логических дисков, чем выход, застрявший с этим количеством дисков первого сервера. Он не дает мне вывода в CSV-файл с остальными дисками других серверов.

Вот пример того, что я говорю.

ServerName Physical_Disk 0 Physical_Disk 1 Physical_Disk 2 Physical_Disk 3
Server1 100 20  40
Server2 85
Server3 60  450 200 420
Server4 60
Server5 60                  
Server10    55  20  40

Если кажется, что я не могу объяснить проблему. Дай мне попробовать снова.

  • Первый сервер имеет 2 физических диска, которые входят в мой выходной файл (CSV).
  • Второй сервер также имеет 2 физических диска, которые также находятся в файле CSV.
  • Но на третьем сервере более 2 дисков, и только 2 диска отображаются на выходе.
1
Rocx 6 Янв 2016 в 15:54

3 ответа

Лучший ответ

Я хотел бы указать, что есть несколько мест, где могла возникнуть ошибка. Цель этого ответа - обратиться к неизвестному количеству заголовков. Я бы порекомендовал вам запустить это на месте, чтобы увидеть, что он пытается вам показать, прежде чем вы попытаетесь интегрировать это.

# Gather all wmi drives query at once
$alldisksInfo = Get-WmiObject –query "SELECT * FROM Win32_DiskDrive" -ComputerName $servers -ErrorAction SilentlyContinue | Group-Object __Server

# Figure out the maximum number of disks
$MaximumDrives = $alldisksInfo | Measure-Object -Property Count -Maximum | Select-Object -ExpandProperty Maximum

# Build the objects, making empty properties for the drives that dont exist for each server where need be. 
$servers | ForEach-Object{
    # Clean the hashtable
    $infoObject = [ordered]@{}

    # Populate Server
    $infoObject.Server = $_    

    # Add other simple properties here
    $infoObject.PhysicalMemory = (Get-WmiObject Win32_PhysicalMemory -ComputerName $infoObject.Server | Measure-Object Capacity -Sum).Sum/1gb

    # Add the disks information from the $diskInfo Array
    $serverDisksWMI = $alldisksInfo | Where-Object{$_.Name -eq $infoObject.Server} | Select-Object -ExpandProperty Group

    for($diskIndex =0; $diskIndex -lt $MaximumDrives;$diskIndex++){
        $infoObject."PhysicalDisk$diskIndex" = [Math]::Round(($serverDisksWMI | Where-Object{($_.DeviceID -replace "^\D*") -eq $diskIndex} | Select -Expand Size)/1GB)
    }

    # Create the custom object now.
    New-Object -TypeName psobject -Property $infoObject
} # | Export-Csv ....

Поскольку здесь используется конвейер, вы можете легко добавить export-CSV в конце этого.

1
Matt 6 Янв 2016 в 15:51

Export-Csv предполагает, что все объекты в вашем списке однородны, т.е. что все они имеют одинаковые свойства, только с разными значениями. Чтобы определить, что экспортировать, необходимы свойства первого элемента. Либо убедитесь, что все объекты имеют одинаковые свойства, либо используйте другой метод вывода, например, поместите всю информацию о диске в массив для каждого хоста и запишите ее в выходной файл, например как это:

foreach ($machine in $servers) {
  $disks = @($machine)
  $disks += Get-WmiObject -Computer $machine -Class Win32_DiskDrive |
            ForEach-Object { [Math]::Round($_.Size/1GB) }
  $disks -join ',' | Add-Content 'C:\path\to\output.csv'
}

Кстати, вам не нужно несколько запросов WMI, поскольку первый уже возвращает все диски, включая их размеры.

2
Ansgar Wiechers 6 Янв 2016 в 14:49

У меня есть сценарий ниже:
И мне нужна помощь в преобразовании вывода в формат Excel .

$Pather = Get-Content C:\Servers.txt
foreach($Path in $Pather)
{
  (Get-Acl $Path).access | ft $path,IdentityReference,FileSystemRights,AccessControlType,IsInherited -auto
}
0
zx485 10 Июл 2018 в 18:30