我正在尝试将一个脚本放在一起,将Azure Powershell命令输出并将输出填充到变量中,以便我可以运行脚本的下一部分。在这种情况下,它会将azure vm设置为混合许可证模型
这是我的get命令,它会在两列中输出我期望的内容:
$output = Get-AzureRmVM | where-object {$_.LicenseType -NE "Windows_Server" -and $_.StorageProfile.osDisk.OsType -eq "Windows"} | select Name,ResourceGroupName
接下来,我想将它输出的vm和资源组名称以某种方式运行并使用这些命令运行它们,这部分将vm设置为使用混合许可证模型。
$rgname = "$output.resourcegroupName"
$vm = Get-AzureRmVM -ResourceGroup $rgname -Name "$output.Name"
$vm.LicenseType = "Windows_Server"
Update-AzureRmVM -ResourceGroupName $rgname -VM $vm
我的问题是我无法将这两者连接在一起,因为第一个get-azurermvm
命令可以输出几个到几百个VM's
。
如果有人能指出我正确的方向,我可能会得到这样的工作,我将不胜感激。
答案 0 :(得分:1)
试试这个 -
$output = Get-AzureRmVM | where-object {$_.LicenseType -NE "Windows_Server" -and $_.StorageProfile.osDisk.OsType -eq "Windows"} | select Name,ResourceGroupName
$VMName = @()
foreach($item in $output)
{
$vm = Get-AzureRmVM -Name $item.Name -ResourceGroup $item.ResourceGroupName
$vm.LicenseType = "Windows_Server"
$VMName += $item.Name
Update-AzureRmVM -ResourceGroupName $item.ResourceGroupName -VM $vm
}
在分配double quotes("")
的值时避免使用$output
。或者,您可以直接使用$Output.Name
和$Output.ResourceGroupName
,而不是使用单独的变量。使用双引号将导致VM的每个字母表成为数组,这是不希望的。如果您的第一个命令有多个输出,那么您可以使用foreach
循环并对输入数组运行相同的命令。 foreach
循环将采用包含多个值的数组并逐个处理它们。因此,您的$vm = Get-AzureRmVM -Name $item.Name -ResourceGroup $item.ResourceGroupName
和Update-AzureRmVM -ResourceGroupName $item.ResourceGroupName -VM $vm
命令将针对$Output
的每个元素运行。
我正在定义一个名为$VMName
的额外数组,以防你需要所有VM's
的名称,以供进一步使用,但恕我直言,这是多余的,因为你可以直接从{{{ 1}}。此外,我无法理解$Output.Name
行的使用,除非你之后会使用它。