Share via


Windows PowerShell:以指令碼撰寫 Cmdlet

Don Jones

Windows PowerShell 第 2 版中很棒的新功能之一是能夠撰寫大幅改良的函式。 這些函式完全撰寫指令碼,具有相同的功能,以 C# 或 Visual Basic 撰寫的並在 Visual Studio 中編譯的 「 真實 」 指令程式。 進階的功能 (they were originally called “script cmdlets” early in the v2 development cycle) 協助您撰寫更有彈性的函式您即可順利地將規則的指令程式旁邊。

所有在繫結

真實只函式和完整的指令程式之間的差異是指令程式支援強大的參數繫結。 您可以使用具名參數、 必要的參數,甚至執行基本參數驗證檢查的位置參數 — 完全由只描述到殼層參數。 以下為範例:

回復執行重做您自己的模組

因此如何執行這個說明您散發您的指令碼更容易? 指令碼模組 ,模組第二種是答案。 這是指令只是標準 Windows PowerShell 碼,.psm1 檔案名稱副檔名,而不是平常的.ps1 檔名的副檔名。 將 mymodule.psm1 放入 \modules 資料夾可讓您執行 匯入模組 MyModule 和您的指令碼將會執行。

通常,指令碼模組包含 完全 的函式。 也就是匯入模組時, 沒有任何實際執行 — 指令碼模組內的函式會載入至的命令介面,並成為整個命令介面都可以使用。 假設您有一個看起來像這樣的指令碼模組:

function Get-Inventory {
    [CmdletBinding()]
    param (
        [parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [string[]]$computername,
        
        [parameter(Mandatory=$false)]
        [alias("PF")]
        [switch]$pingfirst,
        
        [parameter(Mandatory=$true,Position=0)]
        [AllowEmptyString()]
        [string]$class
        
    )
    PROCESS {
    }
}

在此的陳述式中,我宣告三個參數:

  • 電腦名稱是單一的字串的陣列。 它會強制,和它接受字串管線輸入,這表示如果您管道一大堆字串中,它們會自動放到 $ 電腦名稱變數。
  • 不是強制性,pingfirst,但如果您使用它,您應該使用-PF 別名。 它將會節省一點的輸入。 這是表示不會接受一個值切換參數。 它 ’s 是開啟或關閉。
  • 類別也會強制,不過您甚至 don’t 不必鍵入-類別的參數名稱。 只是它適當的值做為第一個位置值時,提供執行函式。 雖然這是強制性,它會接受一個空字串。

有許多的多個屬性 — 以及足夠的範例 — 在線上說明。 執行 幫助 about_Functions_Advanced_Parameters 查看全部。

存取通用參數

命令介面定義數個共用的所有指令程式的通用參數。 它們是-詳細資訊,這用來告訴到輸出比平常更多有關它做什麼的資訊的指令程式。 但是,下列的函式定義會產生錯誤:

function Test-Something {
    [CmdletBinding()]
    param (
        [switch]$verbose
    )
    PROCESS {
    }
}

’s 因為您 can’t re-define-像一般的參數其中一個的詳細資訊。 您要如何因此辨別是否函式以執行-詳細資訊或不? 也,其實是不必要。 Windows PowerShell 會追蹤的它了。 您只需要呼叫 的 寫入詳細資訊,和 Windows PowerShell 將會忽略這些呼叫,如果-wasn’t 使用詳細資訊:

function Test-Something {
    PROCESS {
        Write-Verbose "Starting cmdlet"
    }
}

test-something –verbose

確認的影響

另一組常見的參數為-whatif-並確認。 辨識那些應該會對電腦進行變更某種的指令程式。 它們會提供您選擇讓顯示它會正常做什麼的 Cmdlet (-whatif),或有其個別確認每個動作 (-確認)。 一起,這些參數稱為 ShouldProcess,而您可以宣告它們,支援的函式,如以下所示:

function Delete-Things {
    [CmdletBinding(
        SupportsShouldProcess=$true,
        ConfirmImpact="Medium"
    )]
    PROCESS {
    }
}

這個宣告可讓兩位 whatif-和確認為您的函式的參數。 它也會指定您的函式有 OS 上 」 中的影響等級。 有沒有嚴格的指導方針,為 「 中 」 表示 — 我假設它 ’s 東西小於總嚴重損壞的可能性。 真正的技巧是殼層 ’s $ ConfirmPreference 變數預設為 [高]。Cmdlet ’s 影響時低於 $ ConfirmPreference,然後指令程式會執行而不需確認,除非-whatif 或-確認所指定。

如果指令程式 ’s 影響是等於或高於 $ ConfirmPreference,然後每次您執行指令程式,將作用如同您必須指定-確認即使您忘了執行這項操作。 因此,如果做某件事您的函式 真的很危險 指定一個 ConfirmImpact = 「 高 」,讓您的指令程式會永遠要求確認。 其他的選擇是 「 無 」 和 「 Low 」。

無殼層 ’s 的內建說明實際顯示如何要求確認 — 和 isn’t 自動。 說明是指您線上 MSDN 說明,適用於 Microsoft.NET Framework 開發人員,並完全 doesn’t 參考殼層 ’s 指令碼語言。 所以我此處顯示您:

function Delete-Things {
    [CmdletBinding(
        SupportsShouldProcess=$true,
        ConfirmImpact="High"
    )]
    Param ($param1)
    PROCESS {
        if ($pscmdlet.ShouldProcess($param1)) {
            Write "Deleting..."
        }
    }
}

Delete-Things "organizationalunit"

$ pscmdlet 是內建的變數,您可以使用 PROCESS 指令碼區塊的存取層級的指令程式功能中 — 包括 ShouldProcess 方法。 您傳入的您 ’re 即將修改的描述和殼層會負責處理的顯示實際的確認或 「 如果 」 訊息。

如果 ShouldProcess 傳回 $ True 則可讓您繼續。 如果它傳回 $ False,然後您應該不做任何它是您剛執行。 一旦就有關 $ pscmdlet 變數進行有意義的這些 MSDN 開發人員文件會比較容易。 他們正確描述 ShouldProcess 和它的夥伴,您應該使用不同的方式 — 喜歡 ShouldContinue。

救命啊! 救命啊! 救命啊!

don’t 忘記的功能 — 更進階的 — 可以包含他們自己的內建說明特殊格式的註解中,如我在我 的 3 月 2010年資料行 中所述。 通常,我註解以說明先列出,然後 CmdletBinding] 陳述式然後我的參數,然後在 「 開始 」 {} PROCESS {},和 END {} scriptblocks。 它 ’s 永遠 最好加入您的函式中的說明,您永遠不會知道誰可以受益於它。

如果您撰寫的管線函式之前 (也稱為 「 篩選函式 」),然後您已經知道其他一切需要知道寫入 「 指令碼 Cmdlet 」。PROCESS {} 指令碼區塊是您的程式碼會,並它將會傳送到您的指令程式的每個物件執行一次。 有關這些進階功能的其他項目也是就是喜歡有點簡單對應。

Windows PowerShell v2 是立即可用

雖然送貨預先安裝 Windows Server 2008 R2 與 Windows 7,Windows PowerShell 第 2 版 (和它的同一系列文件管理架構元件 — 現在是適用於 Windows XP、 Windows Server 2003,Windows Vista 及 Windows Server 2008。 support.microsoft.com/kb/968929 取得使用任何作業系統的 [下載] 連結,請造訪。 這應該是與您的 v1 指令碼相容,而且所有未來的資料行就會假設您使用 2.0。

範圍的觀眾

Windows PowerShell 小組 rightly prides 本身上進行 Windows PowerShell 有用到各種不同的技術層級的觀眾。 進階的函式是明確的東西,只是 進階 觀眾很有用的範例。

如果剛入門殼層,也有要提醒自己執行 說明 進階函式則可能還是關閉在未來。 您成功可以使用殼層,而不需要撰寫進階的函式。 一旦您開始取得更進階的並開始撰寫 re-usable 元件找出進階的函式是很好的方法來執行這項操作。

部落格張貼 這裡 是一個很好的範例:同時也會以簡單的命令完成寶貴的工作 — 任何系統管理員可能會寫入的項目。 然後作者逐漸展開成函式然後篩選的函式和最後一個進階的函數他命令 ’s 功能顯示如何殼層可以擴充為您的需求和技術成長。

Don Jones 是一個 founder 集中技術,和 Windows PowerShell 並在其他技術的回答疑問 ConcentratedTech.com. 他也 ’s 的作者 Nexus.Realtimepublishers.com這讓他的書籍的許多免費的電子版本為可用。

相關的內容

·      Windows PowerShell:PowerShell] 與 [Active Directory

·      Windows PowerShell:篩選左,格式右

·      Windows PowerShell:保持安置的