azure之Powershell脚本仅启动列表中的第一个VM

dyllove98 阅读:174 2025-06-02 22:19:02 评论:0

我有一个 Azure powershell 脚本来启动 VM 列表。当它运行时,它会成功启动列表中的第一个虚拟机,然后什么也没有。没有报告错误,它似乎永远不会从启动命令返回

代码如下:

$vmList = "VM1", "VM2", "VM3" 
 
Write-Output "Starting VMs in '$($AzureResourceGroup)' resource group";  
 
Foreach ($vm in $vmList)  
{  
    Write-Output "Starting VM...$vm"  
    $result = Start-AzureRmVM -Name $vm -ResourceGroupName AzureResourceGroup 
    Write-Output "Result of Start VM...$result" 
} 

当此运行时,它输出“正在启动 VM....VM1”,它启动 VM,然后什么也没有...

请您参考如下方法:

听起来您的 Start-AzureVM 调用只是等待虚拟机完成启动

也就是说,Start-AzureVm 默认情况下是一个阻塞、同步操作 - 尽管它的名称是[1]

要使其异步,请使用-AsJob开关,该开关使用后台作业来启动VM;创建该作业后,调用就会结束,并返回一个作业对象,您可以使用该对象稍后通过常用的 *-Job cmdlet 来跟踪启动进度,例如Receive-Job .

<小时 />

[1] 关于名称 Start-AzureVM:

这是一个用词不当,因为 PowerShell 的命名法要求使用 Start 动词来表现异步行为:

来自https://learn.microsoft.com/en-us/powershell/developer/cmdlet/approved-verbs-for-windows-powershell-commands (强调):

Invoke vs. Start The Invoke verb is used to perform an operation that is generally a synchronous operation, such as running a command. The Start verb is used to begin an operation that is generally an asynchronous operation, such as starting a process.

请注意,核心 Start-Sleep cmdlet 的命名也同样错误。

对于默认同步行为,没有好的命名解决方案,因为名称 Invoke-AzureVm 会令人困惑。

更好的方法(这显然是一个重大更改)是让 cmdlet 默认情况下异步,并提供一个 -Wait 开关来选择加入同步操作。


标签:Shell
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号