共用方式為


Windows PowerShell 工作流程概念

Service Management Automation 的一 種 Runbook 類型是以 Windows PowerShell 工作流程為基礎。 本文提供自動化 Runbook 通用之工作流程重要功能的簡短概觀。 與工作流程有關的詳細資料可在 Windows PowerShell 工作流程簡介中取得。

Runbook 結構在 Service Management Automation 的 Runbook 與 Microsoft Azure 自動化 之間完全相同,但兩者通常會使用不同的資源。

Windows PowerShell 工作流程

工作流程是一系列經過程式設計、相互連結的步驟,能夠執行長期的工作,或是需要與多部裝置或受管理節點上的多個步驟協調進行。 以一般指令碼進行工作流程的優勢在於可同時在多個裝置執行動作,並可自動進行失敗修復。 Windows PowerShell 工作流程是使用 Windows Workflow Foundation 的 Windows PowerShell 腳本。 雖然工作流程是以 Windows PowerShell 語法撰寫,並由 Windows PowerShell 啟動,但 Windows Workflow Foundation 會加以處理。

基本結構

Windows PowerShell 工作流程會以 Workflow 關鍵詞開頭,後面接著以大括弧括住的腳本主體。 工作流程的名稱會 遵循 Workflow 關鍵詞,如下列語法所示。 工作流程的名稱符合自動化 Runbook 的名稱。

Workflow Test-Runbook
{
   <Commands>
}

若要將參數新增至工作流程,請使用 Param 關鍵詞,如下列語法所示。 當使用者啟動 Runbook 時,管理入口網站會提示使用者輸入這些參數的值。 此範例會使用選擇性的 Parameter 屬性,這個屬性會指定參數是否為必要參數。

Workflow Test-Runbook
{
  Param
  (
   [Parameter(Mandatory=<$True | $False>]
   [Type]$<ParameterName>,

   [Parameter(Mandatory=<$True | $False>]
   [Type]$<ParameterName>
  )
  <Commands>
}

命名

工作流程的名稱應符合「動詞-名詞」的 Windows PowerShell 標準格式。 您可以參閱 Approved Verbs for Windows PowerShell Commands (核准的 Windows PowerShell 命令動詞) ,取得核准使用的動詞清單。 工作流程的名稱必須符合自動化 Runbook 的名稱。 如果要匯入 Runbook,則檔案名稱必須符合工作流程名稱,且必須以 .ps1 結尾。

限制

如需 Windows PowerShell 工作流程及 Windows PowerShell 之限制及語法差異的完整清單,請參閱 指令碼工作流程與指令碼的語法差異

活動

「活動」是工作流程中的一種特定工作。 就像指令碼由一或多個命令所組成,工作流程是由連續執行的一或多個活動所組成。 Windows PowerShell 工作流程會自動將許多 Windows PowerShell 指令程式轉換成在工作流程中執行的活動。 當您在 Runbook 中指定其中一個指令程式時,Windows Workflow Foundation 會實際執行相應的活動。 對於沒有對應活動的 Cmdlet,Windows PowerShell 工作流程會自動在 InlineScript 活動內執行 Cmdlet。 除非您明確將 Cmdlet 包含在 InlineScript 區塊中,否則會排除在工作流程中,且無法用於工作流程中。 如需這些概念的詳細資訊,請參閱 在腳本工作流程中使用活動。

工作流程活動會共用一組通用參數來設定其作業。 如需工作流程通用參數的詳細資料,請參閱 about_WorkflowCommonParameters

整合模組

整合模組是包含 Windows PowerShell 模組且可匯入至自動化的套件。 Windows PowerShell 模組包含可在自動化 Runbook 中使用的 Cmdlet。 諸如 Operations Manager 及 Azure 之類的產品和服務,都有模組包含其專用的指令程式。

匯入自動化的整合模組會自動提供給所有 Runbook 使用。 由於自動化是以 Windows PowerShell 4.0 為基礎,因此它支援自動載入模組,這表示可以使用已安裝模組的 Cmdlet,而不需使用 Import-Module 將其匯入腳本。

只要其所有相依性都可以位於單一資料夾中,任何 Windows PowerShell 模組都可以匯入至自動化。 如果模組相依於不在預設路徑中的登錄設定或檔案,則可以匯入它,但它很可能無法運作,因為自動化無法找出其相依性。 具有外部相依性的模組必須安裝在其他主機上才可在 Runbook 中使用,然後再用 InlineScript 指令碼區塊加以存取。

透過服務管理自動化,您可以在每部背景工作伺服器上安裝模組與外部相依性。 雖然這些模組中的 Cmdlet 可用於 Runbook,但自動化無法探索這些 Cmdlet 以支援插入活動精靈等功能。 若要使用此功能,您可以使用 New-SmaPortableModule 指令程式建立可攜式模組。 此 Cmdlet 會建立一個模組,其中包含每個 Cmdlet 的存根,並可匯入至自動化。 當 Runbook 使用其中一個指令程式時,虛設常式會將呼叫重新導向至外部模組中的實際指令程式。 該模組必須安裝在每個 Worker 伺服器上,否則呼叫將會失敗。

平行執行

Windows PowerShell 工作流程的其中一個優勢就是可平行執行一組命令,而不需要像一般指令碼一樣依序執行。 這對於 Runbook 來說特別有用,因為 Runbook 可執行需要大量時間完成的多個動作。 例如,Runbook 可能會佈建一組虛擬機器。 動作可以同時執行,而不是依序執行每個布建程式,以提升整體效率。 只有完成所有程序之後,Runbook 才可繼續執行。

您可以使用 Parallel 關鍵詞來建立具有多個命令的腳本區塊,這些命令將會同時執行。 這會使用如下所示的語法。 在此情況中,Activity1 和 Activity2 將會同時開始。 Activity3 則會在 Activity1 和 Activity2 都完成之後才開始。

Parallel
{
  <Activity1>
  <Activity2>
}
<Activity3>

您可以使用 ForEach -Parallel 建構同時處理集合中每個項目的命令。 集合中的項目會以平行方式執行,而指令碼區塊中的命令則會以循序方式執行。 這會使用如下所示的語法。 在此情況下,Activity1 將會同時針對集合中的所有項目啟動。 對每個項目來說,Activity2 將會在 Activity1 完成之後開始。 只有在 Activity1 和 Activity2 都已完成所有項目之後,Activity3 才會啟動。

ForEach -Parallel ($<item> in $<collection>)
{
  <Activity1>
  <Activity2>
}
<Activity3>

Sequence 關鍵詞可用來在平行腳本區塊內依序執行命令。 時序腳本區塊會與其他命令平行執行,但區塊內的命令會循序執行。 這會使用如下所示的語法。 在此情況中,Activity1、Activity2 和 Activity3 將會在相同時間開始。 Activity4 則會在 Activity3 完成之後才開始。 活動 5 會在所有其他活動完成之後啟動

Parallel
{
  <Activity1>
  <Activity2>

  Sequence
  {
   <Activity3>
   <Activity4>
  }
}
<Activity5>

檢查點

檢查點是工作流程的目前狀態快照,其中包含變數目前的值,以及該檢查點所產生的任何輸出。 Runbook 中要完成的最後一個檢查點會儲存至自動化資料庫,讓工作流程即使在中斷的情況下也能繼續。 當 Runbook 作業完成時,檢查點資料就會移除。

您可以透過 Checkpoint-Workflow 活動在工作流程中設定檢查點。 當您在 Runbook 中加入此活動時,就會立即執行檢查點。 如果 Runbook 因發生錯誤而暫停,當作業繼續時,將會從上一個設定的檢查點開始執行。

在下列範例程序代碼中,Activity2 之後發生錯誤,導致 Runbook 暫停。 當作業繼續時,會從執行 Activity2 開始,因為這接在上一個檢查點設定之後。

<Activity1>
Checkpoint-Workflow
<Activity2>
<Error>
<Activity3>

您應該在可能容易發生錯誤的活動之後,在 Runbook 中設定檢查點,而且如果 Runbook 繼續執行,則不應該重複。 例如,您的 Runbook 可能會建立虛擬機器。 您可以在命令之前及之後都設定檢查點以建立虛擬機器。 如果建立失敗,則當 Runbook 恢復時會重複執行這些命令。 如果建立成功,但 Runbook 稍後會失敗,則在繼續 Runbook 時,將不會再次建立虛擬機。

如需檢查點的詳細資訊,請參閱 Adding Checkpoints to a Script Workflow (將檢查點新增至指令碼工作流程)

暫停 Runbook

您可以使用 Suspend-Workflow 活動強制 Runbook 自行暫停。 此活動將會設定檢查點,並使工作流程立即暫停。 暫止工作流程對需要執行手動步驟,才能執行另一組活動的 Runbook 而言十分實用。

如需暫停工作流程的詳細資訊,請參閱 Making a Workflow Suspend Itself (讓工作流程自行暫停)

InlineScript

InlineScript 活動會在個別的非工作流程會話中執行命令區塊,並將其輸出傳回至工作流程。 當工作流程中的命令傳送至 Windows Workflow Foundation 進行處理時,InlineScript 區塊中的命令則會由 Windows PowerShell 執行。 活動會使用標準工作流程一般參數,包括 PSComputerNamePSCredential,這可讓您指定程式代碼區塊在另一部計算機上執行或使用替代認證。

InlineScript 會使用如下所示的語法。

InlineScript
{
  <Script Block>
} <Common Parameters>

Runbook 中 InlineScript 最常見的用法是在另一部電腦上執行程式代碼區塊。 當您的 Runbook 中的 Cmdlet 未安裝在自動化中,或動作只有在目標電腦上本機執行的許可權時,這是必要的。 下圖將提供詳細說明。

內嵌腳本圖表。

為了在另一部計算機上執行程式代碼區塊,PSComputerPSCredential 參數會與 InlineScript 活動搭配使用。 一般會在 Runbook 中使用像 CredentialConnection 一類的全域資源來為這些參數提供值。 下列範例程式碼會在電腦上執行一組命令,並以稱為 MyConnection 的連線表示。

$con = Get-AutomationConnection -Name 'MyConnection'
$securepassword = ConvertTo-SecureString -AsPlainText -String $con.Password -Force
$cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $con.Username, $securepassword
InlineScript
{
  <Commands>
} -PSComputer $con.ComputerName -PSCredential $cred

雖然 InlineScript 活動在某些 Runbook 中可能很重要,但僅在必要時才應該基於下列原因使用:

  • 您無法在 InlineScript 區塊內使用檢查點。 區塊中發生失敗,必須從頭開始進行工作。

  • InlineScript 會影響 Runbook 的延展性,因為它會保留整個 InlineScript 區塊長度的 Windows PowerShell 會話。

  • InlineScript 區塊中無法使用 Get-AutomationVariableGet-AutomationPSCredential 之類的活動。

如果您需要使用 InlineScript,您應該將其範圍降到最低。 例如,如果您的 Runbook 在將相同的作業套用至每個專案時逐一查看集合,循環應該會在 InlineScript 外部發生。 這會提供下列優點:

  • 您可以在每次反覆查詢之後為工作流程設定 檢查點 。 如果作業暫停或中斷後恢復,則迴圈將可繼續。

  • 您可以使用 ForEach「平行 處理收集專案」。

如果您在 Runbook 中使用 InlineScript ,請記住下列建議:

  • 您可以透過 $Using 範圍修改程式將這些值傳送至指令碼。 例如,在 InlineScript 外部設定$abc變數會變成 inlineScript 內的 $using:abc。

  • 若要從 InlineScript 傳回輸出,請將輸出指派給變數,並輸出任何要傳回至輸出數據流的數據。 下列範例會將字串 hi 指派給名為 $output的變數。

    $output = InlineScript { Write-Output "hi" }
    
  • 避免在 InlineScript 範圍內定義工作流程。 即使某些工作流程似乎運作正常,但這不是經過測試的案例。 這可能會導致令人混淆的錯誤訊息或未預期的行為。

如需使用 InlineScript 的詳細資訊,請參閱 在工作流程 中執行 Windows PowerShell 命令和 about_InlineScript

下一步