Как исправить этот скрипт Powershell с помощью Get-WmiObject?

У меня есть этот фрагмент кода, который получает информацию с компьютеров в домене и выводит в файл csv. Я попытался добавить новую строку кода, чтобы также получить информацию о дисках для компьютеров, но я не могу заставить ее работать должным образом.

# Get the list of all computer names and export to CSV file
Get-ADComputer -Filter * | select Name | Export-Csv -Path 'C:\temp\computers.csv' -NoTypeInformation

# Import the computer names from CSV file and get the system information
$computers = Import-Csv “C:\Temp\computers.csv” | ForEach {

    $computerSystem = Get-WmiObject Win32_ComputerSystem -ComputerName $_.Name
    $computerOS = Get-WmiObject Win32_OperatingSystem -ComputerName $_.Name
    $computerCPU = Get-WmiObject Win32_Processor -ComputerName $_.Name
    $computerSN = Get-WmiObject Win32_bios -ComputerName $_.Name | Select-Object SerialNumber
    $computerDisk = Get-WmiObject win32_logicaldisk -ComputerName $_.Name | Select-Object DeviceId

    [PSCustomObject]@{
        'PCName' = $computerSystem.Name    
        'Model' = $computerSystem.Model   
        'RAM' = "{0:N2}" -f ($computerSystem.TotalPhysicalMemory/1GB)    
        'CPU' = $computerCPU.Name    
        'OS' = $computerOS.caption   
        'SN' = $computerSN.SerialNumber
        'User' = $computerSystem.UserName 
        'Disk' = $computerDisk.DeviceId | Format-Table DeviceId, MediaType, @{n="Size";e={[math]::Round($_.Size/1GB,2)}},@{n="FreeSpace";e={[math]::Round($_.FreeSpace/1GB,2)}}
    }

} | Export-Csv 'C:\Temp\system-info.csv' -NoTypeInformation

Это строка кодов для диска.

$computerDisk = Get-WmiObject win32_logicaldisk -ComputerName $_.Name | Select-Object DeviceId

А также...

'Disk' = $computerDisk.DeviceId | Format-Table DeviceId, MediaType, @{n="Size";e={[math]::Round($_.Size/1GB,2)}},@{n="FreeSpace";e={[math]::Round($_.FreeSpace/1GB,2)}}

Остальные параметры работают, но не работает только раздел информации о диске. вывод: System.Object[] вместо отображения информации.


person Community    schedule 13.09.2017    source источник
comment
win32_logicaldisk возвращает набор дисков, поскольку на компьютере может быть несколько дисков. Итак, вам нужен цикл foreach, повторяющий каждый диск   -  person Kiran    schedule 13.09.2017
comment
Как именно вы ожидаете, что будет выглядеть эта строка Disk в CSV?   -  person Mathias R. Jessen    schedule 13.09.2017
comment
В столбце «Диск» мне нужна буква диска (D:, E: и т. д.), емкость и свободный размер в ГБ, возможно, для этого требуется 3 столбца, но я не знаю, как этого добиться.   -  person    schedule 13.09.2017


Ответы (2)


Это немного сработало или у меня, но оно собирает информацию только для первого диска. Кроме того, свободное место больше, чем размер диска, что странно.

$Computers = Import-Csv 'C:\Temp\computers.csv'

$Computers | ForEach {

    $computerSystem = Get-WmiObject Win32_ComputerSystem -ComputerName $_.Name
    $computerOS = Get-WmiObject Win32_OperatingSystem -ComputerName $_.Name
    $computerCPU = Get-WmiObject Win32_Processor -ComputerName $_.Name
    $computerSN = Get-WmiObject Win32_bios -ComputerName $_.Name | Select-Object SerialNumber
    $computerDisk = Get-WmiObject win32_logicaldisk -ComputerName $_.Name | Select-Object DeviceId, Size, FreeSpace

    [PSCustomObject]@{
        'PCName' = $computerSystem.Name    
        'Model' = $computerSystem.Model   
        'RAM' = "{0:N2}" -f ($computerSystem.TotalPhysicalMemory/1GB)    
        'CPU' = $computerCPU.Name    
        'OS' = $computerOS.caption   
        'SN' = $computerSN.SerialNumber
        'User' = $computerSystem.UserName 
        'Disk' = $computerDisk.DeviceId  | Format-Table | Out-String
        'Size' = $computerDisk.Size  | Format-Table | Out-String
        'Free Space' = $computerDisk.FreeSpace  | Format-Table | Out-String
    }

} | Export-Csv 'C:\Temp\system-info.csv' -NoTypeInformation
person Community    schedule 15.09.2017

Вы можете сделать это, чтобы получить результат, который, я думаю, вам нужен:

$Computers = Import-Csv 'C:\Temp\computers.csv'

$Computers | ForEach {

    $computerSystem = Get-WmiObject Win32_ComputerSystem -ComputerName $_.Name
    $computerOS = Get-WmiObject Win32_OperatingSystem -ComputerName $_.Name
    $computerCPU = Get-WmiObject Win32_Processor -ComputerName $_.Name
    $computerSN = Get-WmiObject Win32_bios -ComputerName $_.Name | Select-Object SerialNumber
    $computerDisk = Get-WmiObject win32_logicaldisk -ComputerName $_.Name | Select-Object DeviceId, MediaType, @{n="Size";e={[math]::Round($_.Size/1GB,2)}},@{n="FreeSpace";e={[math]::Round($_.FreeSpace/1GB,2)}}

    [PSCustomObject]@{
        'PCName' = $computerSystem.Name    
        'Model' = $computerSystem.Model   
        'RAM' = "{0:N2}" -f ($computerSystem.TotalPhysicalMemory/1GB)    
        'CPU' = $computerCPU.Name    
        'OS' = $computerOS.caption   
        'SN' = $computerSN.SerialNumber
        'User' = $computerSystem.UserName 
        'Disk' = $computerDisk | Format-Table | Out-String
    }

} | Export-Csv 'C:\Temp\system-info.csv' -NoTypeInformation

Первая проблема заключалась в том, что в строке $computerDisk = вы использовали Select-Object для возврата только свойства DeviceID, но позже пытались использовать другие свойства.

Вторая проблема заключалась в том, что вам нужно передать Format-Table в Out-String при выводе, чтобы преобразовать его в строковый формат, чтобы Export-CSV не рассматривал его как объект.

person Mark Wragg    schedule 13.09.2017
comment
Столбец Диск пуст. Не уверен, почему. - person ; 14.09.2017
comment
Давайте сделаем это проще. мне просто нужен DeviceId, емкость и свободное место. Нет необходимости в типе носителя. Я думаю, что, поскольку каждый компьютер имеет несколько дисков, выходной диск получается нулевым. Поскольку вывод на диск пытается добавить информацию только в 1 столбец. Я прав? - person ; 14.09.2017
comment
Вы открываете его в Excel, чтобы проверить? Поскольку верхняя строка пуста, сначала она выглядит пустой, но она многострочная, поэтому просто разверните строку, и она должна быть там. - person Mark Wragg; 14.09.2017
comment
Да он вообще пустой. - person ; 14.09.2017
comment
Какая версия виндовс? - person Mark Wragg; 14.09.2017
comment
Я использую Windows 10. - person ; 14.09.2017
comment
У меня это работает нормально как в Windows 10, так и в 7. Вы используете мой код точно так, как написано? - person Mark Wragg; 14.09.2017
comment
Все работает, кроме раздела информации о диске. Как вы думаете, нужен ли цикл foreach для информации о диске? - person ; 15.09.2017
comment
Я не думаю, что это корень вашей проблемы, потому что я могу получить вывод для информации о диске, когда использую приведенный выше код. Я думаю, вы должны попробовать запустить Get-WmiObject win32_logicaldisk -ComputerName $_.Name | Select-Object DeviceId, MediaType, @{n="Size";e={[math]::Round($_.Size/1GB,2)}},@{n="FreeSpace";e={[math]::Round($_.FreeSpace/1GB,2)}} парк самостоятельно и посмотреть, получаете ли вы вообще какие-либо результаты. - person Mark Wragg; 15.09.2017
comment
выдает ошибку: "Отсутствует аргумент в списке параметров. В строке: 1 символ: 162 + ... Size;e={[math]::Round($_.Size/1GB,2)}},@{n=FreeSpace‌​;e={[math]:: ...' - person ; 18.09.2017
comment
Это работает, если я использую следующую команду: ' Get-WmiObject win32_logicaldisk | Select-Object DeviceId, @{n=Size;e={[math]::Round($_.Size/1GB,2)}},@{n=FreeSpace;e={[math]::Round($ _.FreeSpace/1GB,2)}}' - person ; 18.09.2017