How many times have you wanted to Start or Stop all Virtual Machines in an Azure Resource Group ? For me it seems to be quite often, especially for development environment resource groups. It’s not that difficult though. You can just enumerate the VM’s then cycle through them and call ‘Start-AzureRMVM’ or ‘Start-AzureRMVM’. However, the more VM’s you have, that approach running serially as PowerShell does means it can take quite some time to complete. Go to the Portal and right-click on each VM and start|stop ?

There has to be a way of starting/shutting down all VM’s in a Resource Group in parallel via PowerShell right ?

Some searching and it seems common to use Azure Automation and Workflow’s to accomplish it. But I don’t want to run this on schedule or necessarily mess around with Azure Automation for development environments, or have to connected to the portal and kickoff the workflow.

What I wanted was a script that was portable. That lead me to messing around with ‘ScriptBlocks’ and ‘Start-Job’ functions in PowerShell. Passing variables in for locally hosted jobs running against Azure though was painful. So I found a quick clean way of doing it, that I detail in this post.


I’m using the brilliant Invoke-Parallel Powershell Script from Cookie.Monster, to in essence multi-thread and run in parallel the Virtual Machine ‘start’ and ‘stop’ requests.

In my script at the bottom of this post I haven’t included the ‘invoke-parallel.ps1’. The link for it is in the paragraph above. You’ll need to either reference it at the start of your script, or include it in your script. If you want to keep it all together in a single script include it like I have in the screenshot below.

My rudimentary PowerShell script takes two parameters;

  1. Power state. Either ‘Start’ or ‘Stop’
  2. Resource Group. The name of the Azure Resource Group containing the Virtual Machines you are wanting to start/stop. eg. ‘RG01’


p style=”background:white;”>Example: .\AzureRGVMPowerGo.ps1 -power ‘Start’ -azureResourceGroup ‘RG01’ or PowerShell .\AzureRGVMPowerGo.ps1 -power ‘Start’ -azureResourceGroup ‘RG01’

Note: If you don’t have a session to Azure in your current environment, you’ll be prompted to authenticate.

Your VM’s will simultaneously start/stop.

What’s it actually doing ?

It’s pretty simple. The script enumerates the VM’s in the Resource Group you’ve specified. It looks to see the status of the VM’s (Running or Deallocated) that is the inverse of the ‘Power’ state you’ve specified when running the script. It’ll start stopped VM’s in the Resource Group when you run it with ‘Start’ or it will stop all started VM’s in the Resource Group when you run it with ‘Stop’. Simples.

This script could also easily be updated to do other similar tasks. Like, delete all VM’s in a Resource Group.

Here it is


Follow Darren Robinson on Twitter

Azure Infrastructure, Azure Platform, PowerShell
, , , ,

Join the conversation! 16 Comments

  1. […] Simultaneously Start|Stop all Azure Resource Manager Virtual Machines in a Resource Group from kloud […]

  2. […] Simultaneously Start|Stop all Azure Resource Manager Virtual Machines in a Resource Group […]

  3. I like it , you saved me the time to write such a script , thanks a lot . few ideas for improvement . In my case I have multiple subscriptions so I have to change the script to use the subscription ID instead on tenant ID

  4. […] In order to stand up the Virtual Machines as quickly as possible I spawn the VM Create process in parallel leveraging the brilliant Invoke-Parallel Powershell Script from Cookie.Monster just as I did for my Simultaneous Start|Stop all AzureRM VM’s script detailed here. […]

  5. Apologies, I may be missing something obvious. But, I can’t find your script on this article.

  6. Hi,

    I am looking for runbook which can help to shutdown all vms in all resource groups in a single subscription id with exclusion list. can you help me.

  7. That’s a great script – thank you.

    I have a usecase where I want my customer to be able use a script like this to start/stop some of the VMs in their account, but NOT to be able to loging to the portal and make changes to the VM configuration.

    Do you if/how I can set up a role to allow that access?


  8. […] an existing script I made some minor modifications and combined a code from from Darren Robinson here that utilizes RamblingCookieMonster’s invoke-parallel function and put them into a single […]

  9. Great script. Saving me a ton of time. Thanks!

  10. […] Native Invoke-Parallel Based on the post ‘Simultaneously Start|Stop all Azure Resource Manager Virtual Machines in a Resource Group‘ we could use the Invoke-Parallel function. As states in the blog post “The […]

  11. Perfect, going to work brilliantly with my DevTest Labs. Thank you.

  12. […] on a year ago I wrote this blog post that detailed a method to “Simultaneously Start|Stop all Azure Resource Manager […]

  13. Hi Darren,

    I think I’m close, but I’m not sure where to go from here. I’m no longer getting, but the VMs aren’t being started either.

    Enumerating VM’s from AzureRM in Resource Group ‘ AX2012R3-DevTest-Dev1-A-4ac3eae28e47cb84 ‘
    WARNING: Breaking change notice: In upcoming release, top level properties, DataDiskNames and NetworkInterfaceIDs, will
    be removed from VM object because they are also in StorageProfile and NetworkProfile, respectively.
    Starting VM’s in Resource Group AX2012R3-DevTest-Dev1-A-4ac3eae28e47cb84

    Thanks for this article and for your help!


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: