Вывод вызова New-AzureRmVm недоступен, пока не будет возвращен вызывающей стороне. - PullRequest
0 голосов
/ 22 мая 2019

При вызове New-AzureRMVM вывод включает в себя объект, представляющий созданную виртуальную машину, но объект недоступен, пока я не нахожусь за пределами функции.

В приведенном ниже фрагменте кода, находясь внутриФункция Create-VM, вывод ($ newVM.Name) равен $ null.Но если я возвращаю $ newVM вызывающей стороне, тогда $ V.Name содержит значение.

# PSVersion                      5.1.17763.503                                                                                                                                                 

Function Create-VM 
{
    param
    (
        [Parameter(Mandatory=$true)]
        [string]$vmName

        # and some others ... 
    )

    # Snipped
    try 
    {
        $newVM =  New-AzureRMVM -ResourceGroupName $vmResourceGroup # ... 
        Write-Host "newVM.IsSuccessStatusCode = $($newVM.IsSuccessStatusCode)" 
        Write-Host "newVM.Name  = $($newVM.Name)" 
        return $newVM
    }
    catch 
    {
        # Snipped
    }

}

$vmName ="testvm1"
$V = Create-VM  -vmName $vmName # .... 
if ($V) 
{
    Write-Host $V.GetType() # why does this return System.Object[]?
    Write-Host "V.IsSuccessStatusCode = $($V.IsSuccessStatusCode)" 
    Write-Host "V.Name  = $($V.Name)"  # why does this return a value??? 
}

Вывод выглядит следующим образом:

WARNING: New-AzureRmVM: A property of the output of this cmdlet will change in an upcoming breaking change release. The StorageAccountType property
for a DataDisk will return Standard_LRS and Premium_LRS
newVM.IsSuccessStatusCode = True
newVM.Name  =
System.Object[]
V.IsSuccessStatusCode = True
V.Name  = testvm1

Проходя по этому коду в отладчике, мы видим, что $ newVM - это отдельный объект типа "PSAzureOperationResponse", когда он находится внутрифункция Create-VM, но когда она возвращается вызывающей стороне, она становится массивом System.Object [] из двух объектов:

  • $ V [0] имеет тип "PSAzureOperationResponse"
  • $ V [1] имеет тип "PSVirtualMachine"

Именно поэтому $ newVM.Name возвращает $ null, но $ V.Name возвращает свойство name объекта VM ("testvm1")

Может кто-нибудь объяснить, как это работает?Должно быть какое-то странное выходное связывание.

PS.Новая виртуальная машина действительно правильно создана!

1 Ответ

0 голосов
/ 30 мая 2019

Я попытался выполнить сценарий, представленный выше (с небольшими изменениями), на моем компьютере, работающем под управлением той же версии Powershell 5.1.17763.503 и AzureRM версии 6.13.1, и смог получить доступ к объекту newVM в рамках функции Create-VM и после возвращения, а также. Вот скрипт и вывод:

# PSVersion                      5.1.17763.503    
# AzureRM                        6.13.1                                                                                                                                        

Function Create-VM 
{
    param
    (
        [Parameter(Mandatory=$true)]
        [string]$vmName

        # and some others ... 
    )

    # Snipped
    try 
    {
        $newVM =  New-AzureRMVM -ResourceGroupName $ResourceGroupName # ... 
        Write-Host "`nnewVM.StatusCode = $($newVM.StatusCode)" # StatusCode is the property
        Write-Host "newVM.Name = $($newVM.Name)" 
        Write-Host $newVM.GetType()
        return $newVM
    }
    catch 
    {
        Write-Host "in the catch block"
    }

}

$vmName ="testvm1"
$V = Create-VM -vmName $vmName # .... 
if ($V) 
{
    Write-Host "`nOut of Create-VM"
    Write-Host $V.GetType()
    Write-Host "V.StatusCode = $($V.StatusCode)" 
    Write-Host "V.Name  = $($V.Name)"
}

Выход:

Supply values for the following parameters:
Name: testvm0

newVM.StatusCode = 0
newVM.Name = testvm0
Microsoft.Azure.Commands.Compute.Models.PSVirtualMachine

Out of Create-VM
Microsoft.Azure.Commands.Compute.Models.PSVirtualMachine
V.StatusCode = 0
V.Name  = testvm0

Можете ли вы попробовать обновить до последней версии AzureRM и проверить, помогает ли это? Если нет, вы можете добавить период ожидания / сна на несколько секунд.

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