Почему Get-VHD filesize возвращает 0 для виртуальных машин, размещенных на сервере Server 2012R2 в задании Powershell Runspace?

Почему Get-VHD filesize возвращает 0 для виртуальных машин, размещенных на сервере Server 2012R2 в задании Powershell Runspace?

У меня есть этот скрипт для создания CSV виртуальных машин, размещенных на наших кластерах Hyper-V. Он отлично работает, и я даже разделил каждую виртуальную машину на задание!

Примечание: Я бы не отказался от совета, как эффективнее составить расписание. Основная проблема в том, что некоторые кластеры — это WS 2016, а другие — WS 2012R2, которым требуется старый модуль PowerShell Hyper-V. Я не уверен, как распараллеливать разные модули, поэтому я просто получаю список виртуальных машин для каждого узла Hyper-V, распараллеливаю их, а затем меняю модуль, если он требуется следующему узлу.

В любом случае, моя проблема. Вот мой сценарий.

$numThreads = 4

$ScriptBlock = {
    Param (
        [string]$Cluster,
        [string]$Node,
        $VM
    )

    If ($ADComputer = (Get-ADComputer $VM.Name -Properties OperatingSystem)) {
        $OS = $ADComputer.OperatingSystem
    }
    Else {
        $OS = 'Unknown (not on domain)'
    }

    try {
        Return [pscustomobject] @{
            Cluster               = $Cluster
            Node                  = $Node
            Name                  = $VM.Name
            OS                    = $OS
            State                 = $VM.State
            Status                = $VM.Status
            Uptime                = "{0:dd} days {0:hh} hours" -f $VM.Uptime
            CPUUsage              = $VM.CPUUsage
            ProcessorCount        = $VM.ProcessorCount
            'MemoryDemand (GB)'   = [math]::Round( $VM.MemoryDemand / 1GB, 2 )
            'MemoryAssigned (GB)' = [math]::Round( $VM.MemoryAssigned / 1GB, 2 )
            'VHD Size (GB)'       = [math]::Round( ((Get-VHD -ComputerName $Node -VMId $VM.Id).FileSize | Measure-Object -Sum).Sum / 1GB, 2 )
            Version               = $VM.Version
            'VLAN IDs'            = ($VM | Select-Object -ExpandProperty NetworkAdapters | Select-Object -ExpandProperty VlanSetting).AccessVlanId -Join ", "
            'IP Addresses'        = ($VM | Select-Object -ExpandProperty NetworkAdapters).IPAddresses -Join ", "
        }
    }
    catch {
        Return [pscustomobject] @{
            Cluster = $Cluster
            Node    = $Node
            Name    = $VM.Name
            State   = "Script Fail"
            Status  = $_.Exception.Message
        }
    }
}

$RunspacePool = [RunspaceFactory]::CreateRunspacePool(1, $numThreads)
$RunspacePool.Open()

$Jobs = @()
$VMInfoList = @()

ForEach ($Cluster in 'USHOMECLU0', 'USHOMECLU1') {
    If ((Get-ADComputer $Cluster -Property OperatingSystem).OperatingSystem -Match '2016') {
        Remove-Module Hyper-V
        Import-Module Hyper-V -RequiredVersion 2.0.0.0
    }
    Else {
        Remove-Module Hyper-V
        Import-Module Hyper-V -RequiredVersion 1.1
    }
    ForEach ($Node in Get-ClusterNode -Cluster $Cluster) {
        Get-VM -ComputerName $Node | ForEach-Object {
            $Job = [powershell]::Create().AddScript($ScriptBlock).AddParameter("Cluster", $Cluster).AddParameter("Node", $Node).AddParameter("VM", $_)
            $Job.RunspacePool = $RunspacePool
            $Jobs += New-Object PSObject -Property @{
                Job    = $Job
                Result = $Job.BeginInvoke()
            }
        }
    }
}

# EndInvoke returns the objects from the background threads
ForEach ($Job in $Jobs) {
    $VMInfoList += $Job.Job.EndInvoke($Job.Result)
}

$VMInfoList | Export-Csv -NoTypeInformation C:\PSReports_vms.csv

Проблема в том, что задания для виртуальных машин на узлах Windows Server 2012R2 всегда возвращают 0 для этого:

        'VHD Size'       = ((Get-VHD -ComputerName $Node -VMId $VM.Id).FileSize | Measure-Object -Sum).Sum

Однако для узлов Windows Server 2016 все виртуальные машины возвращают соответствующее значение. Интересно также то, что если я захвачу точное выражение, назначенное VHD Size для этих виртуальных машин Server 2012R2 (заменю переменные прямой строкой), и выполню его вне блока скрипта для задания, я получу точное значение.

Связанный контент