PowerShell возвращает несколько значений объекта WMI из функции - PullRequest
0 голосов
/ 27 января 2020

Я создаю функцию для извлечения основной информации о диске с предоставленного имени сервера. В функции я хочу получить букву диска, свободное место, общее пространство и процент свободного места. Я борюсь с возвращаемым объектом и как вернуть несколько значений. Я не получил букву диска, который я ожидаю. Для буквы диска я получаю что-то вроде @ (DeviceID = C :) или длинную строку для буквы диска, которая выглядит как UN C. Как передать несколько значений в виде объекта из функции? (Мой опыт работы с PowerShell составляет около 1 месяца)

Код

function Get-DiskPercentFree ($serverName){

$diskinfo = Get-WmiObject Win32_LogicalDisk -ComputerName $($serverName)  -Filter DriveType=3 | Select-Object $($serverName), DeviceID, @{'Name'='Size (GB)'; 'Expression'={[math]::truncate($_.size / 1GB)}}, @{'Name'='Freespace (GB)'; 'Expression'={[math]::truncate($_.freespace / 1GB)}}, @{'Name'='Percent Free'; 'Expression'={[math]::round(($_.freespace / $_.size) * 100)}} | Format-Table;

new-object psobject -property  @{Server = $($serverName); Drive = $($_.DeviceID)}
}
Get-DiskPercentFree("DevServerName") 

1 Ответ

0 голосов
/ 27 января 2020

Во-первых, будьте осторожны с командлетами Format. Они должны использоваться только в самом конце и не сохраняться в переменной.

Ваш командлет New-Object также не ссылается на переменную $diskinfo. Так что $_.DeviceID будет неопределенным, потому что по конвейеру ничего не передается.

Также не нужны дополнительные операторы подвыражений $().

Мне лично нравится ускоритель типа [pscustomobject], использующий New-Object, так как он более читабелен.

function Get-DiskPercentFree {

    [CmdletBinding(ConfirmImpact = 'Low')]
    param (
        [string]$ServerName
    )

    $DiskInfo = Get-WmiObject Win32_LogicalDisk -ComputerName $($ServerName)  -Filter DriveType=3

    [PSCustomObject]@{
        'ServerName'     = $ServerName
        'DeviceID'       = $DiskInfo.DeviceID
        'Size (GB)'      = [math]::Truncate($DiskInfo.Size / 1GB)
        'Freespace (GB)' = [math]::Truncate($DiskInfo.FreeSpace / 1GB)
        'Percent Free'   = [math]::Round(($DiskInfo.FreeSpace / $DiskInfo.Size) * 100)
    }
}

Get-DiskPercentFree "DevServerName"

Наконец, вы пробовали командовать Get-Volume?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...