При вызове 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.Новая виртуальная машина действительно правильно создана!