管理 Azure 自動化中的 Runbook

您可以將 Runbook 新增至 Azure 自動化,方法是建立新的,或是從檔案或 Runbook 資源庫匯入現有的。 本文提供管理 Runbook 和 Runbook 設計建議模式與最佳做法的資訊。 您可以在 Azure 自動化的 Runbook 和模組資源庫中找到有關存取社群 Runbook 和模組的所有詳細資料。

建立 Runbook

使用 Azure 入口網站或 PowerShell,在 Azure 自動化中建立新的 Runbook。 一旦建立 Runbook 之後,您可以使用下列文章中的資訊加以編輯:

在 Azure 入口網站中建立 Runbook

  1. 登入 Azure 入口網站
  2. 搜尋並選取 [自動化帳戶]。
  3. 自動化帳戶分頁上,從清單中選取您的自動化帳戶。
  4. 在自動帳戶中,選取 [程序自動化] 底下的 [Runbook],以開啟 Runbook 清單。
  5. 按一下 [建立 Runbook]
    1. 為 Runbook 命名。
    2. 從 [Runbook 類型] 下拉式清單中。 選取其類型。 Runbook 名稱必須以字母開頭,可以包含字母、數字、底線和連字號
    3. 選取執行階段版本
    4. 輸入適用的描述
  6. 按一下 [建立] 以建立 Runbook。

使用 PowerShell 建立 Runbook

您可以使用 New-AzAutomationRunbook \(英文\) Cmdlet 來建立空白 Runbook。 使用 Type 參數指定針對 New-AzAutomationRunbook 所定義四個 Runbook 類型的其中一個。

下列範例示範如何建立新的空白 Runbook。

$params = @{
    AutomationAccountName = 'MyAutomationAccount'
    Name                  = 'NewRunbook'
    ResourceGroupName     = 'MyResourceGroup'
    Type                  = 'PowerShell'
}
New-AzAutomationRunbook @params

匯入 Runbook

您可以匯入 PowerShell 或 PowerShell 工作流程 (ps1) 指令碼、圖形化 Runbook (.graphrunbook) 或 Python 2 或 Python 3 指令碼 (.py) 來製作自己的 Runbook。 您須指定匯入期間建立的 Runbook 類型,並考量下列事項。

  • 您可以將不包含工作流程的 .ps1 檔案匯入至 PowerShell RunbookPowerShell 工作流程 Runbook。 您將其匯入 PowerShell 工作流程 Runbook,其會轉換成工作流程。 在此情況下,Runbook 中會包含註解來描述所做的變更。

  • 您只能將包含 PowerShell 工作流程的 .ps1 檔案匯入至 PowerShell 工作流程 Runbook。 如果檔案包含多個 PowerShell 工作流程,則匯入會失敗。 您必須將每個工作流程儲存到它們各自的檔案,並且個別匯入。

  • 請勿將包含 PowerShell 工作流程的 .ps1 檔案匯入 PowerShell Runbook,因為 PowerShell 指令碼引擎無法加以辨識。

  • 只將 .graphrunbook 檔案匯入新的圖形化 Runbook

從 Azure 入口網站匯入 Runbook

您可以使用下列程序,將指令碼檔案匯入到 Azure 自動化。

注意

若使用入口網站,您只能將 .ps1 檔案匯入 PowerShell 工作流程 Runbook。

  1. 在 Azure 入口網站中,搜尋並選取 [自動化帳戶]。
  2. 自動化帳戶分頁上,從清單中選取您的自動化帳戶。
  3. 在自動帳戶中,選取 [程序自動化] 底下的 [Runbook],以開啟 Runbook 清單。
  4. 按一下 [匯入 Runbook]。 您可以選取下列其中一個選項:
    1. 瀏覽檔案 - 從本機電腦中選取檔案。
    2. 瀏覽資源庫 - 您可以瀏覽資源庫並選取現有的 Runbook。
  5. 選取 檔案。
  6. 如果 [名稱] 欄位已啟用,則您可以選擇變更 Runbook 名稱。 名稱必須以字母開頭,可以包含字母、數字、底線和連字號。
  7. Runbook 類型會自動填入,但在考量適用的限制之後,您可以變更類型。
  8. 執行階段版本會自動填入,或從下拉式清單中挑選版本。
  9. 按一下 [匯入]。 新的 Runbook 會顯示在自動化帳戶的 Runbook 清單中。
  10. 您必須先發佈 Runbook 才能執行它。

注意

匯入圖形化 Runbook 之後,您可以將其轉換成另一種類型。 不過,您無法將圖形化 Runbook 轉換成文字式 Runbook。

使用 PowerShell 匯入 Runbook

使用 Import-AzAutomationRunbook \(英文\) Cmdlet,來匯入為指令碼檔案以作為草稿 Runbook。 如果 Runbook 已經存在,除非您搭配 Cmdlet 使用 Force 參數,否則匯入會失敗。

以下範例示範如何將指令碼檔案匯入 Runbook。

$params = @{
    AutomationAccountName = 'MyAutomationAccount'
    Name                  = 'Sample_TestRunbook'
    ResourceGroupName     = 'MyResourceGroup'
    Type                  = 'PowerShell'
    Path                  = 'C:\Runbooks\Sample_TestRunbook.ps1'
}
Import-AzAutomationRunbook @params

處理資源

如果您的 Runbook 會建立資源,則指令碼應先檢查以查看資源是否已經存在,再嘗試加以建立。 以下是基本定義。

$vmName = 'WindowsVM1'
$rgName = 'MyResourceGroup'
$myCred = Get-AutomationPSCredential 'MyCredential'

$vmExists = Get-AzResource -Name $vmName -ResourceGroupName $rgName
if (-not $vmExists) {
    Write-Output "VM $vmName does not exist, creating"
    New-AzVM -Name $vmName -ResourceGroupName $rgName -Credential $myCred
} else {
    Write-Output "VM $vmName already exists, skipping"
}

從活動記錄擷取詳細資料

您可以從自動化帳戶的活動記錄擷取 Runbook 詳細資料,例如啟動 Runbook 的人員或帳戶。 下列 PowerShell 範例會提供執行所指定 Runbook 的最後一個使用者。

$rgName = 'MyResourceGroup'
$accountName = 'MyAutomationAccount'
$runbookName = 'MyRunbook'
$startTime = (Get-Date).AddDays(-1)

$params = @{
    ResourceGroupName = $rgName
    StartTime         = $startTime
}
$JobActivityLogs = (Get-AzLog @params).Where( { $_.Authorization.Action -eq 'Microsoft.Automation/automationAccounts/jobs/write' })

$JobInfo = @{}
foreach ($log in $JobActivityLogs) {
    # Get job resource
    $JobResource = Get-AzResource -ResourceId $log.ResourceId

    if ($null -eq $JobInfo[$log.SubmissionTimestamp] -and $JobResource.Properties.Runbook.Name -eq $runbookName) {
        # Get runbook
        $jobParams = @{
            ResourceGroupName     = $rgName
            AutomationAccountName = $accountName
            Id                    = $JobResource.Properties.JobId
        }
        $Runbook = Get-AzAutomationJob @jobParams | Where-Object RunbookName -EQ $runbookName

        # Add job information to hashtable
        $JobInfo.Add($log.SubmissionTimestamp, @($Runbook.RunbookName, $Log.Caller, $JobResource.Properties.jobId))
    }
}
$JobInfo.GetEnumerator() | Sort-Object Key -Descending | Select-Object -First 1

追蹤進度

最佳做法是使用可輕鬆重複使用及重新啟動的邏輯,將您的 Runbook 撰寫為本質上是模組化的。 追蹤 Runbook 中的進度可確保 Runbook 邏輯會在發生問題時正確執行。

您可以藉由使用儲存體帳戶、資料庫或共用檔案等外部來源來追蹤 Runbook 進度。 在您的 Runbook 中建立邏輯,以先檢查所採取最後一個動作的狀態。 然後,根據檢查結果,邏輯可以略過或繼續 Runbook 中的特定工作。

防止並行作業

某些 Runbook 如果跨多個作業同時執行,其會以奇怪的方式運作。 在此情況下,Runbook 務必要實作判斷是否已經有執行中作業的邏輯。 以下是基本定義。

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with system-assigned managed identity 
$AzureContext = (Connect-AzAccount -Identity).context

# set and store context 
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription -DefaultProfile $AzureContext

# Check for already running or new runbooks 
$runbookName = "runbookName" 
$resourceGroupName = "resourceGroupName" 
$automationAccountName = "automationAccountName"

$jobs = Get-AzAutomationJob -ResourceGroupName $resourceGroupName -AutomationAccountName $automationAccountName -RunbookName $runbookName -DefaultProfile $AzureContext

# Ranking all the active jobs
$activeJobs = $jobs | where {$_.status -eq 'Running' -or $_.status -eq 'Queued' -or $_.status -eq 'New' -or $_.status -eq 'Activating' -or $_.status -eq 'Resuming'} | Sort-Object -Property CreationTime 
$jobRanking = @() 
$rank = 0 
ForEach($activeJob in $activeJobs) 
{         
    $rank = $rank + 1 
    $activeJob | Add-Member -MemberType NoteProperty -Name jobRanking -Value $rank -Force 
    $jobRanking += $activeJob 
}
    
$AutomationJobId = $PSPrivateMetadata.JobId.Guid 
$currentJob = $activeJobs | where {$_.JobId -eq $AutomationJobId} 
$currentJobRank = $currentJob.jobRanking 

# Only allow the Job with Rank = 1 to start processing. 
If($currentJobRank -ne "1") 
{ 
    Write-Output "$(Get-Date -Format yyyy-MM-dd-hh-mm-ss.ffff) Concurrency check failed as Current Job Ranking is not 1 but $($currentJobRank) therefore exiting..." 
    Exit 
} Else
{
    Write-Output "$(Get-Date -Format yyyy-MM-dd-hh-mm-ss.ffff) Concurrency check passed. Start processing.." 
} 

如果您想要 Runbook 以系統指派的受控識別來執行,請將程式碼保持原狀。 如果您偏好使用使用者指派的受控識別,則:

  1. 從第 5 行移除 $AzureContext = (Connect-AzAccount -Identity).context
  2. 將其取代為 $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context,然後
  3. 輸入用戶端識別碼。

注意

針對 PowerShell 7.2 混合式作業,變更第 28 行。 把 $PSPrivateMetadata.JobId.Guid 替換為 $env:PSPrivateMetaData

在時間相依指令碼中處理暫時性錯誤

您的 Runbook 必須健全且能夠處理錯誤,包括可能導致其重新啟動或失敗的暫時性錯誤。 如果 Runbook 失敗,Azure 自動化會加以重試。

如果您的 Runbook 通常會在有限時間內執行,請讓指令碼實作邏輯來檢查執行時間。 此檢查可確保作業 (例如啟動、關機或擴增) 只會在特定時間執行。

注意

Azure 沙箱程序的本地時間會設定為 UTC。 您 Runbook 中的日期和時間計算必須考慮這一點。

在 Runbook 中重試邏輯,以避免暫時性失敗。

Runbook 通常會透過 ARM、Azure Resource Graph、SQL 服務和其他 Web 服務呼叫遠端系統 (例如 Azure)。 當 Runbook 呼叫的系統忙碌、暫時無法使用或實作負載下節流時,呼叫很容易發生執行階段錯誤。 若要在 Runbook 中建置復原功能,必須在進行呼叫時實作重試邏輯,以便 Runbook 可以處理暫時性問題,不會出現失敗。

如需詳細資訊,請參閱重試模式一般 REST 和重試指引

範例 1:如果您的 Runbook 只進行一或兩次呼叫

$searchServiceURL = "https://$searchServiceName.search.windows.net"
$resource = Get-AzureRmResource -ResourceType "Microsoft.Search/searchServices" -ResourceGroupName $searchResourceGroupName -ResourceName  $searchServiceName -ApiVersion 2015-08-19
$searchAPIKey = (Invoke-AzureRmResourceAction -Action listAdminKeys -ResourceId $resource.ResourceId -ApiVersion 2015-08-19 -Force).PrimaryKey

當您呼叫 Invoke-AzureRmResourceAction 時,可能會發現暫時性失敗。 在這種情況下,建議您在呼叫 Cmdlet 時實作下列基本模式。

$searchServiceURL = "https://$searchServiceName.search.windows.net"
$resource = Get-AzureRmResource -ResourceType "Microsoft.Search/searchServices" -ResourceGroupName $searchResourceGroupName -ResourceName  $searchServiceName -ApiVersion 2015-08-19

    # Adding in a retry
    $Stoploop = $false
    $Retrycount = 0
 
    do {
        try   {
               $searchAPIKey = (Invoke-AzureRmResourceAction -Action listAdminKeys -ResourceId $resource.ResourceId -ApiVersion 2015-08-19 -Force).PrimaryKey
               write-verbose "Invoke-AzureRmResourceAction on $resource.ResourceId completed"
               $Stoploop = $true
              }
        catch {
               if ($Retrycount -gt 3)
                 {
                  Write-verbose "Could not Invoke-AzureRmResourceAction on $resource.ResourceId after 3 retrys."
                  $Stoploop = $true
                 }
               else  
                 {
                  Write-verbose "Could not Invoke-AzureRmResourceAction on $resource.ResourceId retrying in 30 seconds..."
                  Start-Sleep -Seconds 30
                  $Retrycount = $Retrycount + 1
                 }
               }
        }
    While ($Stoploop -eq $false)

注意

重試呼叫的嘗試最多三次,每次持續 30 秒。

範例 2:如果 Runbook 進行頻繁的遠端呼叫

如果 Runbook 進行頻繁的遠端呼叫,則可能會遇到暫時性執行階段問題。 建立函式,針對所進行的每個呼叫實作重試邏輯,並傳遞要作為指令區塊執行的呼叫。

Function ResilientRemoteCall {

         param(
               $scriptblock
               )
        
         $Stoploop = $false
         $Retrycount = 0
 
         do {
             try   {
                    Invoke-Command -scriptblock $scriptblock 
                    write-verbose "Invoked $scriptblock completed"
                    $Stoploop = $true
                   }
             catch {
                    if ($Retrycount -gt 3)
                      {
                       Write-verbose "Invoked $scriptblock failed 3 times and we will not try again."
                       $Stoploop = $true
                      }
                    else  
                      {
                       Write-verbose "Invoked $scriptblock failed  retrying in 30 seconds..."
                       Start-Sleep -Seconds 30
                       $Retrycount = $Retrycount + 1
                      }
                    }
             }
         While ($Stoploop -eq $false)
}

然後,您可以將每個遠端呼叫傳遞至函式,作為

ResilientRemoteCall { Get-AzVm }

ResilientRemoteCall { $searchAPIKey = (Invoke-AzureRmResourceAction -Action listAdminKeys -ResourceId $resource.ResourceId -ApiVersion 2015-08-19 -Force).PrimaryKey}

使用多個訂用帳戶

您的 Runbook 必須能夠搭配訂用帳戶運作。 例如,若要處理多個訂用帳戶,Runbook 會使用 Disable-AzContextAutosave \(英文\) Cmdlet。 此 Cmdlet 可確保系統不會從在相同沙箱中執行的另一個 Runbook 擷取驗證內容。

# Ensures you do not inherit an AzContext in your runbook
Disable-AzContextAutosave -Scope Process

# Connect to Azure with system-assigned managed identity
$AzureContext = (Connect-AzAccount -Identity).context

# set and store context
$AzureContext = Set-AzContext -SubscriptionName $AzureContext.Subscription `
    -DefaultProfile $AzureContext

$childRunbookName = 'childRunbookDemo'
$resourceGroupName = "resourceGroupName"
$automationAccountName = "automationAccountName"

$startParams = @{
    ResourceGroupName     = $resourceGroupName
    AutomationAccountName = $automationAccountName
    Name                  = $childRunbookName
    DefaultProfile        = $AzureContext
}
Start-AzAutomationRunbook @startParams

如果您想要 Runbook 以系統指派的受控識別來執行,請將程式碼保持原狀。 如果您偏好使用使用者指派的受控識別,則:

  1. 從第 5 行移除 $AzureContext = (Connect-AzAccount -Identity).context
  2. 將其取代為 $AzureContext = (Connect-AzAccount -Identity -AccountId <ClientId>).context,然後
  3. 輸入用戶端識別碼。

使用自訂指令碼

注意

您通常無法在已安裝 Log Analytics 代理程式的主機上執行自訂指令碼和 Runbook。

使用自訂指令碼:

  1. 建立自動化帳戶。
  2. 部署混合式 Runbook 背景工作角色。
  3. 如果在 Linux 機器上,您需要提高的權限。 登入以關閉簽章檢查

測試 Runbook

當您測試 Runbook 時, 草稿版本 會執行,而且它執行的任何動作都會完成。 不會建立任何工作歷程記錄,但 [測試輸出] 窗格中會顯示輸出警告和錯誤串流。 只有將 VerbosePreference 變數設定為 Continue,傳送給詳細資訊串流的訊息才會顯示在 [輸出] 窗格中。

即使執行的是草稿版本,Runbook 仍會正常執行,並對環境中的資源執行任何動作。 因此,您只應在非生產資源中測試 Runbook。

注意

所有 Runbook 執行動作都會記錄在自動化帳戶的活動記錄中,並使用建立 Azure 自動化作業作為作業名稱。 不過,在執行 Runbook 草稿版本的測試窗格中,Runbook 的執行會記錄在作業名稱為寫入 Azure 自動化 Runbook 草稿的活動記錄中。 選取 [作業] 和 [JSON] 索引標籤,可查看以 ../runbooks/(runbook name)/draft/testjob 結尾的範圍。

測試每個 Runbook 類型的程序都相同。 無論是在文字式編輯器或 Azure 入口網站的圖形化編輯器中進行測試,都沒有任何差別。

  1. 您可以在文字編輯器圖形化編輯器中開啟 Runbook 的草稿版本。
  2. 按一下 [測試] 以開啟 [測試] 頁面。
  3. 如果 Runbook 有參數,其會列在左窗格中,您可以在此提供用於測試的值。
  4. 如果您想要在混合式 Runbook 背景工作角色上執行測試,請將 [執行設定] 變更為 [混合式背景工作角色],然後選取目標群組的名稱。 否則,請保留預設值 Azure,以便在雲端中執行測試。
  5. 按一下 [開始] 以開始測試。
  6. 您可以使用 [輸出] 窗格下的按鈕來停止或暫止測試中的 PowerShell 工作流程圖形化 Runbook。 暫停 Runbook 時,它會先完成目前的活動後才暫停。 暫停 Runbook 後,您可以停止或重新啟動它。
  7. 您可以在 [輸出] 窗格中檢查 Runbook 的輸出。

發行 Runbook

建立或匯入新的 Runbook 後,您必須發佈 Runbook 才能執行它。 Azure 自動化中的每個 Runbook 都有草稿版本和已發行版本。 只有已發佈版本可執行,且只有草稿版本可供編輯。 已發佈版本不受草稿版本的任何變更影響。 草稿版本應該已可供使用時,您會加以發佈,以草稿版本覆寫目前的已發佈版本。

在 Azure 入口網站中發行 Runbook

  1. 在 Azure 入口網站中,搜尋並選取 [自動化帳戶]。
  2. 自動化帳戶分頁上,從清單中選取您的自動化帳戶。
  3. 在您的自動化帳戶中開啟 Runbook。
  4. 按一下 [編輯]
  5. 按一下 [發佈],然後選取 [是] 來回應驗證訊息。

使用 PowerShell 發佈 Runbook

您可以使用 Publish-AzAutomationRunbook Cmdlet 來發佈 Runbook。

$accountName = "MyAutomationAccount"
$runbookName = "Sample_TestRunbook"
$rgName = "MyResourceGroup"

$publishParams = @{
    AutomationAccountName = $accountName
    ResourceGroupName     = $rgName
    Name                  = $runbookName
}
Publish-AzAutomationRunbook @publishParams

在 Azure 入口網站中排程 Runbook

當您的 Runbook 發佈之後,您可以針對作業加以排程:

  1. 在 Azure 入口網站中,搜尋並選取 [自動化帳戶]。
  2. 自動化帳戶分頁上,從清單中選取您的自動化帳戶。
  3. 從 Runbook 清單中選取 Runbook。
  4. 選取 [資源] 底下的 [排程]。
  5. 然後選取 [新增排程]
  6. 在 [排程 Runbook] 窗格中,選取 [將排程連結至 Runbook]。
  7. 選擇 [排程] 窗格中的 [建立新排程]。
  8. 在 [新增排程] 窗格中輸入名稱、描述和其他參數。
  9. 建立排程之後,請加以反白,然後按一下 [確定]。 其現在應該已連結至您的 Runbook。
  10. 尋找您信箱中通知您 Runbook 狀態的電子郵件。

還原已刪除的 Runbook

您可以透過 PowerShell 指令碼復原已刪除的 Runbook。 若要復原 Runbook,請確認符合下列條件:

  • 要還原的 Runbook 是在過去 29 天內刪除。
  • 該 Runbook 的自動化帳戶存在。
  • 自動化參與者角色權限已授與自動化帳戶的系統指派受控識別。

PowerShell 指令碼

  • 在自動化帳戶中以作業形式執行 PowerShell 指令碼,還原已刪除的 Runbook。
  • 從 GitHub 下載 PowerShell 指令碼。 或者,您也可以從 Runbook 資源庫匯入 名為還原自動化 Runbook 的 PowerShell 指令碼。 提供要還原的 Runbook 名稱,並在 Azure 自動化中以作業形式執行,還原已刪除的 Runbook。
  • 從 GitHub 下載指令碼,或從 Runbook 資源庫匯入名為列出已刪除的自動化 Runbook PowerShell 指令碼,以識別在過去 29 天內刪除的 Runbook 名稱。

取得作業狀態

在 Azure 入口網站中檢視狀態

作業中提供 Azure 自動化中工作處理的詳細資料。 當您準備好查看 Runbook 作業時,請使用 Azure 入口網站並存取您的自動化帳戶。 在右邊,您可以在 [作業統計資料] 圖格下方,看到所有 Runbook 作業的摘要。

Job Statistics tile

摘要會針對已執行的每個作業顯示作業狀態的計數和圖形表示。

按一下圖格,即會顯示 [作業] 頁面,其中包含所有已執行作業的摘要清單。 此頁面會顯示每個作業的狀態、Runbook 名稱、開始時間和完成時間。

Screenshot of the Jobs page.

您可以藉由選取 [篩選作業] 來篩選作業清單。 篩選特定的 Runbook、作業狀態,或從下拉式清單中選擇,並提供搜尋的時間範圍。

Filter job status

或者,您可以檢視特定 Runbook 的作業摘要詳細資料,方法是在您的自動化帳戶中,從 [Runbook] 頁面中選取該 Runbook,然後選取 [作業]。 此動作會顯示 [作業] 頁面。 您可以從此處按一下作業記錄,以檢視其詳細資料和輸出。

Screenshot of the Jobs page with the Errors button highlighted.

使用 PowerShell 擷取作業狀態

使用 Get-AzAutomationJob Cmdlet 擷取針對 Runbook 建立的工作以及特定工作的詳細資料。 如果您使用 Start-AzAutomationRunbook 啟動 Runbook,其會傳回產生的作業。 使用 Get-AzAutomationJobOutput 來擷取作業輸出。

下列範例會針對範例 Runbook 取得上一個作業並顯示其狀態、提供給 Runbook 參數的值,以及作業輸出。

$getJobParams = @{
    AutomationAccountName = 'MyAutomationAccount'
    ResourceGroupName     = 'MyResourceGroup'
    Runbookname           = 'Test-Runbook'
}
$job = (Get-AzAutomationJob @getJobParams | Sort-Object LastModifiedDate -Desc)[0]
$job | Select-Object JobId, Status, JobParameters

$getOutputParams = @{
    AutomationAccountName = 'MyAutomationAccount'
    ResourceGroupName     = 'MyResourceGroup'
    Id                    = $job.JobId
    Stream                = 'Output'
}
Get-AzAutomationJobOutput @getOutputParams

下列範例會擷取特定作業的輸出,並傳回每一筆記錄。 如果其中一個記錄有例外狀況,則指令碼會寫入例外狀況,而不是值。 此行為非常有用,因為例外狀況可以提供通常可能不會在輸出期間記錄的額外資訊。

$params = @{
    AutomationAccountName = 'MyAutomationAccount'
    ResourceGroupName     = 'MyResourceGroup'
    Stream                = 'Any'
}
$output = Get-AzAutomationJobOutput @params

foreach ($item in $output) {
    $jobOutParams = @{
        AutomationAccountName = 'MyAutomationAccount'
        ResourceGroupName     = 'MyResourceGroup'
        Id                    = $item.StreamRecordId
    }
    $fullRecord = Get-AzAutomationJobOutputRecord @jobOutParams

    if ($fullRecord.Type -eq 'Error') {
        $fullRecord.Value.Exception
    } else {
        $fullRecord.Value
    }
}

下一步