关于azure powershell,两次定义一个变量,创建磁盘的问题

Question about azure powershell, defining a veriable twice, and disk creation

我目前正在准备 az-104 azure 考试并进行一些脚本练习。

我可以确认下面的脚本有效,但我不明白如何...

  1. 在脚本的最后几行中,变量 $vm 被定义了两次。这怎么可能?

  2. 另外,当您定义一个变量时,它实际上是 运行 正在定义的命令吗?我没有意识到是这种情况,但它似乎确实是..有人可以解释一下吗?

$resourcegroup = "2019dc_group"
$machinename = "2019dc"
$location = "east us"
$storagetype = "Standard_LRS"
$name = "newdisk"
$size = 20
$datadiskconfig = new-azdiskconfig -SkuName $storagetype -location $location -createoption empty -DiskSizeGB $size
$datadisk01 = new-azdisk -diskname $name -disk $datadiskconfig -ResourceGroupName $resourcegroup
$vm = Get-AzVM -name $machinename -resourcegroupname $resourcegroup
$vm = add-azvmdatadisk -vm $vm -name $name -createoption attach -ManagedDiskId $datadisk01.id -lun 1
update-azvm -vm $vm -resourcegroupname $resourcegroup

PowerShell 中的变量类型是动态的。它们会自动“调整”到它们分配给的对象的类型。 是的,首先执行命令,然后将对象放入变量中。这也是为什么您可以在命令中使用 vm 变量并将结果分配回该变量的原因。当执行“add-azvmdatadisk”命令时,变量的类型仍然是Azure VM。分配发生时,它是一个 Azure VM 数据磁盘

您可以使用 Get-Member 获取任何对象的类型、方法、属性、事件等。

$a = 1 #System.Int32
$a | Get-Member
$a = "1" #System.String
$a | Get-Member
$a = Get-Service | Select-Object -First 1 #System.ServiceProcess.ServiceController
$a | Get-Member

$VM变量定义两次。它被 赋值 两次。不需要在Powershell中定义变量,赋值会自动创建一个。

让我们回顾一下代码。首先,

$vm = Get-AzVM -name $machinename -resourcegroupname $resourcegroup

Get-AzVM 之后,您将在 $vm 中获得它的输出。这里没什么好看的。请注意,在此语句之前,$vm 不存在,尝试使用它会产生有关使用空值的错误。

$vm = add-azvmdatadisk -vm $vm -name $name -createoption attach -ManagedDiskId $datadisk01.id -lun 1

这里$vm用了两次。第一个用法是将它作为参数传递给 Add-AzVmDataDisk。 cmdlet returns 一个 PSVirtualMachine 对象,因此在添加磁盘后,您会在变量中获得 $vm 的更新版本。这可能重要也可能不重要。如果对 Azure VM 对象进行惰性评估,则旧的 $vm 将包含没有新磁盘的硬件信息。这种情况经常发生,因为它可以提高性能。通过将后面的 cmdlet 的输出分配给 $vm,您一定会拥有最新版本的 VM。

如果您有实验室环境,请尝试在最后一次磁盘添加 cmdlet 调用之前和之后打印 $vm。查看输出有何不同。