本節說明您應該考慮的指導方針,以確保良好的開發和用戶體驗。 有時候可能會套用,有時也可能不適用。
設計指導方針
設計 Cmdlet 時,應考慮下列指導方針。 當您找到適用於您情況的設計指導方針時,請務必查看類似指導方針的程式代碼指導方針。
支援 InputObject 參數 (AD01)
因為 Windows PowerShell 可直接與Microsoft .NET Framework 物件搭配運作,因此 .NET Framework 物件通常與使用者執行特定作業所需的類型完全相符。
InputObject 是接受這類物件做為輸入之參數的標準名稱。
例如,Stop-Proc中的範例 Cmdlet 會InputObject定義 Process 類型的參數,以支援管線的輸入。 使用者可以取得一組進程物件、作它們以選取要停止的確切物件,然後直接將它們傳遞至 Stop-Proc Cmdlet。
支援 Force 參數 (AD02)
有時候,Cmdlet 必須保護使用者無法執行要求的作業。 如果使用者具有執行作業的許可權,這類 Cmdlet 應該支援 Force 參數,讓使用者覆寫該保護。
例如, Remove-Item Cmdlet 通常不會移除只讀檔案。 不過,此 Cmdlet 支援 Force 參數,讓使用者可以強制移除唯讀檔案。 如果使用者已經有修改只讀屬性的許可權,而且使用者移除檔案,則 Force 參數的使用可簡化作業。 不過,如果使用者沒有移除檔案的許可權, Force 參數就不會有任何作用。
透過 Windows PowerShell 處理認證 (AD03)
Cmdlet 應該定義 Credential 參數來表示認證。 此參數的類型必須是 System.Management.Automation.PSCredential ,而且必須使用 Credential 屬性宣告來定義。 此支援會自動提示使用者輸入使用者名稱、輸入密碼,或未直接提供完整認證時兩者。 如需認證屬性的詳細資訊,請參閱 認證屬性宣告。
支援編碼參數 (AD04)
如果您的 Cmdlet 讀取或寫入二進位格式的文字,例如寫入文件系統中的檔案或從檔案讀取,則您的 Cmdlet 必須具有 Encoding 參數,以指定二進位格式中的文字編碼方式。
測試 Cmdlet 應該傳回布爾值 (AD05)
針對其資源執行測試的 Cmdlet 應該會將 System.Boolean 類型傳回管線,使其可用於條件表達式中。
程式代碼指導方針
撰寫 Cmdlet 程式代碼時,應考慮下列指導方針。 當您找到適用於您情況的指導方針時,請務必查看類似指導方針的設計指導方針。
遵循 Cmdlet 類別命名慣例 (AC01)
依照標準命名慣例,您可以讓 Cmdlet 更容易探索,並協助使用者確切瞭解 Cmdlet 的用途。 這種做法對於使用 Windows PowerShell 的其他開發人員來說特別重要,因為 Cmdlet 是公用類型。
在正確的命名空間中定義 Cmdlet
您通常會在 .NET Framework 命名空間中定義 Cmdlet 的類別,這個類別會附加 .Commands 至代表 Cmdlet 執行之產品的命名空間。 例如,Windows PowerShell 隨附的 Cmdlet 定義於 命名空間中 Microsoft.PowerShell.Commands 。
將 Cmdlet 類別命名為符合 Cmdlet 名稱
當您將實作 Cmdlet 的 .NET Framework 類別命名為 時,請將 類別<Verb><Noun>Command命名為 ,其中您將 和 <Verb> 佔位元取代<Noun>為 Cmdlet 名稱所使用的動詞和名詞。 例如, Get-Process Cmdlet 是由稱為 GetProcessCommand的類別實作。
如果沒有管線輸入覆寫 BeginProcessing 方法 (AC02)
如果您的 Cmdlet 不接受管線的輸入,應該在 System.Management.Automation.Cmdlet.BeginProcessing 方法中實作處理。 使用此方法可讓 Windows PowerShell 維護 Cmdlet 之間的順序。 管線中的第一個 Cmdlet 一律會傳回其物件,再讓管線中的其餘 Cmdlet 有機會開始處理。
若要處理停止要求,請覆寫 StopProcessing 方法 (AC03)
覆寫 System.Management.Automation.Cmdlet.StopProcessing 方法,讓您的 Cmdlet 可以處理停止訊號。 有些 Cmdlet 需要很長的時間才能完成其作業,而且會在呼叫 Windows PowerShell 運行時間之間長時間傳遞,例如 Cmdlet 在長時間執行的 RPC 呼叫中封鎖線程時。 這包括呼叫 System.Management.Automation.Cmdlet.WriteObject 方法、 System.Management.Automation.Cmdlet.WriteError 方法的 Cmdlet ,以及可能需要很長時間才能完成的其他意見反應機制。 在這些情況下,使用者可能需要傳送停止訊號給這些 Cmdlet。
實作 IDisposable 介面 (AC04)
如果您的 Cmdlet 具有 System.Management.Automation.Cmdlet.ProcessRecord 方法未處置的物件(寫入管線),您的 Cmdlet 可能需要額外的物件處置。 例如,如果您的 Cmdlet 在其 System.Management.Automation.Cmdlet.BeginProcessing 方法中開啟檔案句柄,並且讓句柄保持開啟,以供 System.Management.Automation.Cmdlet.ProcessRecord 方法使用,此句柄必須在處理結束時關閉。
Windows PowerShell 運行時間不一定會呼叫 System.Management.Automation.Cmdlet.EndProcessing 方法。 例如,如果 Cmdlet 在作業中途取消 Cmdlet 或 Cmdlet 的任何部分發生終止錯誤,則可能不會呼叫 System.Management.Automation.Cmdlet.EndProcessing 方法。 因此,需要物件清除之 Cmdlet 的 .NET Framework 類別應該實作完整的 System.IDisposable 介面模式,包括完成項,讓 Windows PowerShell 運行時間可以在處理結束時呼叫 System.Management.Automation.Cmdlet.EndProcessing 和 System.IDisposable.Dispose* 方法。
使用易串行化的參數型態 (AC05)
若要支援在遠端電腦上執行 Cmdlet,請使用可在用戶端電腦上串行化的類型,然後在伺服器電腦上解除凍結。 下列類型是串行化易記的。
基本類型:
- Byte、SByte、Decimal、Single、Double、Int16、Int32、Int64、Uint16、UInt32 和 UInt64。
- 布爾值、Guid、Byte[]、TimeSpan、DateTime、Uri 和 Version。
- Char、String、XmlDocument。
內建可重新凍結類型:
- PSPrimitiveDictionary
- 開關參數
- PSListModifier
- PSCredential
- IPAddress、MailAddress
- CultureInfo
- X509Certificate2、X500DistinguishedName
- DirectorySecurity、FileSecurity、RegistrySecurity
其他類型:
- SecureString(安全字串)
- 容器(上述類型的清單和字典)
使用 SecureString 進行敏感資料 (AC06)
處理敏感數據時,一律使用 System.Security.SecureString 數據類型。 這可能包括參數的管線輸入,以及將敏感數據傳回管線。
雖然 .NET 建議不使用 SecureString 進行新的開發,但 PowerShell 會繼續支援 SecureString 類別以提供回溯兼容性。 使用 SecureString 仍然比使用純文字字串更安全。 PowerShell 仍然依賴 SecureString 類型,以避免不小心將內容公開至主控台或記錄中。 請小心使用 SecureString ,因為它可以輕鬆地轉換成純文字字串。 如需使用 SecureString 的完整討論,請參閱 System.Security.SecureString 類別 檔。