Подтвердите Успешное выражение с условием if в powershell - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь запустить длинную команду PowerCLI в сценарии powershell и вывести ее на консоль в зависимости от ее успеха.Команда выполняется и успешно выполняется, но НЕ запускает вывод об успешном завершении.

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

Try{      
        #get list of all vms
        Write-Host "Collecting data and adding to file..."
        [Environment]::NewLine
        #create list of VMs in a variable
        $vmList = Get-VM -ErrorAction Stop


        #collect the VMWare Disk List here.
        #run the list through the appropriate filters and prompt for success (failure will initiate the catch)
        if ($vmList | Where-Object {$_.PowerState -eq "PoweredOff" -and $_.ExtensionData.config.ManagedBy.ExtensionKey -ne 'com.vmware.vcDr'} | Select-Object Name, @{N="Disk (GB)"; E={[math]::Round(($_ | Get-HardDisk | Measure-Object CapacityGB -Sum).sum)}}, @{N="Power State"; E={$_.PowerState}} | Export-Csv -Append -LiteralPath c:\temp\VMdiskTotals.csv) {
        Write-Host "vCenter Disk Collection for " $vcenter " Successful!"
        }

        }
Catch{
            Write-Host "Failed to collect the data from " $vcenter.Vcenter -ForegroundColor Red
            }

Я хочу, чтобы это запустило команду, и если она завершится без ошибок, выведите:

"vCenter Disk Collection для" $ vcenter "Successful!"

, если команда выдает ЛЮБУЮ ошибку, она должна вызвать перехват и вывод:

Write-Host "Не удалось собрать данныеот "$ vcenter.Vcenter -ForegroundColor Red

Ответы [ 2 ]

1 голос
/ 19 мая 2019

До сих пор неясно, зачем вам все помещать в оператор if. Но, возможно, это подойдет вам:

try {
    $vmList = Get-Vm -ErrorAction Stop
    if ($vmList) {  # If there are any VM objects in the array
        "vCenter Disk Collection for $vcenter Successful!"
        $vmList | Where-Object {$_.PowerState -eq "PoweredOff" -and $_.ExtensionData.config.ManagedBy.ExtensionKey -ne 'com.vmware.vcDr'} | 
            Select-Object Name, @{N="Disk (GB)"; E={[math]::Round(($_ | Get-HardDisk | Measure-Object CapacityGB -Sum).sum)}}, @{N="Power State"; E={$_.PowerState}} | 
            Export-Csv -Path c:\temp\VMdiskTotals.csv -Append -ErrorAction Stop
        "Successfully outputted to file."
    }
    else {
        "No VMs found."
    }
}
catch [VMware.VimAutomation.Sdk.Types.V1.ErrorHandling.VimException.VimException] {
    "Search for VMs failed."
}
catch [System.IO.IOException] {
    "Unable to write to file."
}
catch {
    "Other catch."
    $Error[0]
}
1 голос
/ 14 мая 2019

Один из способов сделать это - записать эту информацию в переменную в вашем операторе If, а затем в блоке сценария, для которого она выводится в CSV и записывается в консоль.

    if (($ToOutput=$vmList | Where-Object {$_.PowerState -eq "PoweredOff" -and $_.ExtensionData.config.ManagedBy.ExtensionKey -ne 'com.vmware.vcDr'})){
        $ToOutput | Select-Object Name, @{N="Disk (GB)"; E={[math]::Round(($_ | Get-HardDisk | Measure-Object CapacityGB -Sum).sum)}}, @{N="Power State"; E={$_.PowerState}} | Export-Csv -Append -LiteralPath c:\temp\VMdiskTotals.csv
        Write-Host "vCenter Disk Collection for " $vcenter " Successful!"
    }
...