使用 Exchange 管理命令介面撰寫指令碼

 

適用版本: Exchange Server 2007 SP3, Exchange Server 2007 SP2, Exchange Server 2007 SP1, Exchange Server 2007

上次修改主題的時間: 2009-12-18

對於大多數的一般工作,一次執行一個指令程式或透過管線一起執行都可以。不過,有時您可能會希望自動執行工作。Exchange 管理命令介面支援根據 Microsoft .NET Framework 的指令碼語言,此指令碼語言功能強大,類似其他命令介面中的指令碼語言。Exchange 管理命令介面可讓您建立相當簡單到相當複雜的各種指令碼。將完整支援用於迴圈、條件式、流程控制和各種指派的語言建構。

每個組織都有某方面為其所獨有的工作。系統管理員可利用指令碼檔案的程式庫來執行這些工作,以節省時間,並在已安裝 Exchange 管理命令介面的任何電腦上執行這些指令碼。

如需如何使用指令碼的相關資訊,請參閱<使用 Windows PowerShell 撰寫指令碼>(英文)。由於 Exchange 管理命令介面是建置於 Microsoft Windows PowerShell 技術之上,因此,Windows PowerShell 的指令碼指引也適用於 Exchange 管理命令介面。

在 Exchange 管理命令介面內執行指令碼

熟悉 Cmd.exe 環境的使用者,知道如何執行命令介面指令碼。命令介面指令碼和副檔名為 .bat 的文字檔並沒有什麼不同。就像批次檔一樣,您可以使用文字編輯器 (如 [記事本]),來建立 Exchange 管理命令介面指令碼檔案。Exchange 管理命令介面指令碼檔會使用 .ps1 的副檔名。

呼叫指令碼檔案時,Exchange 管理命令介面會使用指令碼檔案的根目錄。依預設,根目錄為 <root drive>:\Program Files\Microsoft\Exchange Server\bin 目錄。您也可以從命令列執行 $PSHome,藉以在任何執行 Exchange 管理命令介面的電腦上,確認目前的 PSHome 目錄。這兩個目錄都在 PATH 環境變數中。

如果指令碼檔案是儲存於根目錄中,您可以使用指令碼名稱來呼叫它。如果指令碼檔案位於目前位置之外的其他地方,則必須使用路徑及指令碼名稱。如果指令碼檔案位於目前位置中,即需在指令碼名稱前加上 .\

下列範例會顯示呼叫三個不同指令碼的命令語法需求。這些範例都會使用 Get-Date 指令程式,但這些指令程式是來自三個不同位置。

[PS] C:\>Get-Date-Script-A.ps1
Friday, January 20, 2006 3:13:01 PM

指令碼檔案 Get-Date-Script-A.ps1 位於 $PSHhome 所指定的目錄中,只需指令碼名稱即可執行。

[PS] C:\>c:\workingfolder\Get-Date-Script-B.ps1
Friday, January 20, 2006 3:13:25 PM

指令碼檔案 Get-Date-Script-B.ps1 位於 C:\workingfolder 目錄中,因此必須提供完整路徑才能執行。

[PS] C:\>.\Get-Date-Script-C.ps1
Friday, January 20, 2006 3:13:40 PM

指令碼檔案 Get-Date-Script-C.ps1 位於目前位置 C:\ 中。因此,必須在它的前面加上 .\ 才能執行。

[PS] C:\>Get-Date-Script-C.ps1
'Get-Date-Script-C.ps1' is not recognized as a Cmdlet, function, operable program, or script file.
At line:1 char:21
+ Get-Date-Script-C.ps1 <<<<

在最後一個範例中,如果在未加上前置詞 .\ 的情況下呼叫同一個指令碼 Get-Date-Script-C.ps1,,則會顯示預期的結果。

最佳作法是一律針對指令碼檔案提供描述性名稱,並在指令碼中加入註解以描述其用途及識別每一個關注點。此外,也應加入一些作者的相關資訊,以防執行指令碼的人對其用法有問題。在指令碼內文中使用井字號 (#) 作為註解行開頭。

從 Cmd.exe 執行指令碼

如果您希望根據 Windows 工作排程器服務所排定的時間來執行指令碼,可以呼叫 Exchange 管理命令介面,並加入要執行的指令碼作為參數。因為 Exchange 管理命令介面是 Windows PowerShell 的嵌入式管理單元,所以當您執行命令時也必須載入 Exchange 管理命令介面嵌入式管理單元,才能執行任何 Exchange 相關的指令程式。若要載入 Exchange 管理命令介面嵌入式管理單元並從 Cmd.exe 命令執行指令碼,必須使用下列語法:

PowerShell.exe -PSConsoleFile "C:\Program Files\Microsoft\Exchange Server\Bin\ExShell.Psc1" -Command ". '<Path to Your Script>'"

例如,若要從 C:\My Scripts 執行指令碼 RetrieveMailboxes.ps1,請使用下列命令:

PowerShell.exe -PSConsoleFile "C:\Program Files\Microsoft\Exchange Server\Bin\ExShell.Psc1" -Command ". 'C:\My Scripts\RetrieveMailboxes.ps1'"

如需從 Cmd.exe 環境呼叫 Exchange 管理命令介面時可使用的其他選項,請輸入 PowerShell.exe /?

從 Exchange 管理主控台中取得提示

在 Microsoft Exchange Server 2007 中,您可以使用 Exchange 管理主控台檢視用來執行特定工作之特定 Exchange 管理命令介面命令的詳細資訊。當您在 Exchange 管理主控台中執行精靈時,精靈會採用您輸入的資訊,並之後由電腦執行的建立 Exchange 管理命令介面命令。您可以直接複製此命令並貼到 Exchange 管理命令介面或將此命令複製到文字編輯器中以便修改。如果您檢查 Exchange 管理主控台如何建立命令,即可更加了解如何建構或修改這些命令以符合未來需求。

例如,若您針對名為 Frank Lee 的人員建立新信箱,則新增信箱精靈的 [完成] 頁面上會顯示下列資訊:

圖 1   新增信箱精靈完成頁面

新增信箱完成頁面

您可以在 [完成] 頁面上顯示的資訊中取得必要的相關資訊,以確定在 Exchange 管理命令介面中執行的類似命令會順利完成。在 [完成] 頁面上,按 CTRL+C,將此資訊複製到 [剪貼簿] 中。接著使用文字編輯器來檢查命令,以判斷要變更哪些部分才能新增更多信箱。您也可以自訂命令,如此即可將命令當成使用逗號分隔值 (CSV) 檔案或其他輸入來源之指令碼的一部分,以自動建立數個信箱。

測試指令碼

建立新指令碼時,均應先在實驗室環境中加以測試,再套用到實際執行環境中。當您在實驗室中測試指令碼並於實際執行環境中進行部署時,可以使用 WhatIf 參數 (Exchange 管理命令介面中內含的許多指令程式中都有此參數),來驗證指令碼是否會依預期般地執行。WhatIf 參數會指示執行其所套用到的命令,但只會顯示執行命令會影響的物件以及會對這些物件進行的變更,而不實際變更這些物件。

如需 WhatIf 參數的相關資訊,請參閱 WhatIf、Confirm 及 ValidateOnly 參數

指令碼的疑難排解

有許多原因會讓指令碼的運作方式與預期的不同。所以很難判斷問題在哪裡以及有哪種問題。Exchange 管理命令介面可藉由報告錯誤點上的行及字元,協助您找出一般的語法錯誤。若指令碼語法正確但卻出現意外的行為,則要診斷問題就會變得更加困難。Exchange 管理命令介面包含簡單的偵錯功能,可藉由檢查指令碼執行時所進行的每個步驟,為指令碼檔案進行疑難排解。此功能稱為追蹤。

若要啟用追蹤並檢查指令碼中每個命令步驟,請使用 Set-PSDebug 指令程式,並將 Trace 參數的值設為 1。若要在進行每個步驟及每個變數指派時加以檢查,請將 Trace 參數的值設為 2。若要關閉追蹤,請將 Trace 參數的值設為 0 (零)。

若要逐行檢查指令碼中的每個命令,請使用具有 Step 參數的 Set-PSDebug 指令程式。每個步驟都會提示您繼續作業。Step 模式中有下列選擇:

[Y] Yes (continue to the next step)
[A] Yes to All (continue to the end of the script)
[N] No (stop this step)
[L] No to All (stop all remaining steps)
[S] Suspend (suspend at this point and drop to a prompt)

Suspend 可讓您結束並進入可執行任何命令的提示,例如,在指令碼存取某物件之前,先檢查或設定其上的值。當您準備好要繼續指令碼執行時,請輸入 Exit,控制權會立即返回指令碼的暫停點上。