﻿# 如何在 Azure Lab Services 中批次啟動與停止實驗室中所有虛擬機器 (VMs)

最近因為企業內訓的授課需求，需要在 Azure 上建立 20 台客製化環境的虛擬機器(VMs)，這個時候正是使用 Azure Lab Services 的最佳時機 (以前的名稱叫做 Azure DevTest Labs 實驗室服務)。由於透過 Azure Lab Services 建立的 VMs 可以設定每天定時自動關機、自動開機，用以節省 Azure 的花費，這是一個非常貼心的設計。不過，客戶這邊的課程並不是每天上課，而是每周上課一次，這個設定就不太好用了。本篇文章我來分享剛寫好的兩份 Azure PowerShell 指令檔，方便日後批次啟動或停止這些實驗室中的虛擬機器。

### 批次啟動特定 Lab 下所有 VMs

```powershell
# 批次啟動特定 Lab 下所有 VMs

# 使用前請先變更以下參數:
$subscriptionId = "<請輸入訂用帳戶名稱ID>"
$labResourceGroup = "<請輸入資源群組名稱>"
$labName = "<請輸入Lab的資源名稱>"

# 第一次執行時，才需要執行登入動作
Connect-AzureRmAccount

# 選取訂用帳戶
Select-AzureRmSubscription -SubscriptionId $subscriptionId

# 取得這個 Lab 的資源物件
$lab = Get-AzureRmResource -ResourceId ('subscriptions/' + $subscriptionId + '/resourceGroups/' + $labResourceGroup + '/providers/Microsoft.DevTestLab/labs/' + $labName)

# 取得這個 Lab 下的所有 VMs
$labVMs = Get-AzureRmResource | Where-Object {
          $_.ResourceType -eq 'microsoft.devtestlab/labs/virtualmachines' -and
          $_.Name -like "$($lab.Name)/*"}

# 啟動所有 VMs
foreach($labVM in $labVMs)
{
    Invoke-AzureRmResourceAction -ResourceId $labVM.ResourceId -Action Start -Force
}
```

### 批次停止特定 Lab 下所有 VMs

```powershell
# 批次停止特定 Lab 下所有 VMs

# 使用前請先變更以下參數:
$subscriptionId = "<請輸入訂用帳戶名稱ID>"
$labResourceGroup = "<請輸入資源群組名稱>"
$labName = "<請輸入Lab的資源名稱>"

# 第一次執行時，才需要執行登入動作
Connect-AzureRmAccount

# 選取訂用帳戶
Select-AzureRmSubscription -SubscriptionId $subscriptionId

# 取得這個 Lab 的資源物件
$lab = Get-AzureRmResource -ResourceId ('subscriptions/' + $subscriptionId + '/resourceGroups/' + $labResourceGroup + '/providers/Microsoft.DevTestLab/labs/' + $labName)

# 取得這個 Lab 下的所有 VMs
$labVMs = Get-AzureRmResource | Where-Object {
          $_.ResourceType -eq 'microsoft.devtestlab/labs/virtualmachines' -and
          $_.Name -like "$($lab.Name)/*"}

# 停止所有 VMs
foreach($labVM in $labVMs)
{
    Invoke-AzureRmResourceAction -ResourceId $labVM.ResourceId -Action Stop -Force
}
```

### 批次刪除特定 Lab 下所有 VMs

```powershell
# 批次刪除特定 Lab 下所有 VMs

# 使用前請先變更以下參數:
$subscriptionId = "<請輸入訂用帳戶名稱ID>"
$labResourceGroup = "<請輸入資源群組名稱>"
$labName = "<請輸入Lab的資源名稱>"

# 第一次執行時，才需要執行登入動作
Connect-AzureRmAccount

# 選取訂用帳戶
Select-AzureRmSubscription -SubscriptionId $subscriptionId

# 取得這個 Lab 的資源物件
$lab = Get-AzureRmResource -ResourceId ('subscriptions/' + $subscriptionId + '/resourceGroups/' + $labResourceGroup + '/providers/Microsoft.DevTestLab/labs/' + $labName)

# 取得這個 Lab 下的所有 VMs
$labVMs = Get-AzureRmResource | Where-Object {
          $_.ResourceType -eq 'microsoft.devtestlab/labs/virtualmachines' -and
          $_.Name -like "$($lab.Name)/*"}

# 刪除所有 VMs
foreach($labVM in $labVMs)
{
    Remove-AzureRmResource -ResourceId $labVM.ResourceId -Force
}
```

**相關連結**

-   [Azure Lab Services (formerly DevTest Labs) Preview Documentation](https://learn.microsoft.com/en-us/azure/lab-services/)
-   [Azure DevTest Labs FAQ | Microsoft Docs](https://learn.microsoft.com/en-us/azure/lab-services/devtest-lab-faq)
-   [Invoke-AzureRmResourceAction (AzureRM.Resources) - Microsoft Docs](https://learn.microsoft.com/en-us/powershell/module/az.resources/invoke-azresourceaction)
-   [Remove-AzureRmResource (AzureRM.Resources) - Microsoft Docs](https://learn.microsoft.com/en-us/powershell/module/az.resources/remove-azresource)
-   [Install Azure PowerShell on Windows with PowerShellGet](https://learn.microsoft.com/en-us/powershell/azure/install-azps-windows)
