windows编写linux脚本,Windows PowerShell:共享您的脚本 - 在脚本中编写 Cmdlet | Microsoft Docs...
Windows PowerShell:在腳本中編寫 Cmdlet
08/17/2016
本文內容
Don Jones
Windows PowerShell v2 中一項很酷的新功能是能夠編寫性能明顯改進的函數。這些函數完全是在腳本中編寫的,與使用 C# 或 Visual Basic 編寫并在 Visual Studio 中編譯的“真正”Cmdlet 具有相同的功能。這些高級函數 在 V2 開發周期的早期最初稱為“腳本 Cmdlet”,可以幫助您編寫更靈活的函數,然后您就可以將它們與常規 Cmdlet 一起無縫使用。
在綁定中完成所有操作
純粹的函數與完整 Cmdlet 之間的真正差別在于 Cmdlet 支持功能強大的參數綁定。您可以使用位置參數、命名參數和強制參數,甚至可以執行基本的參數驗證檢查,所有這些都只需要向 Shell 說明參數。例如:
動手創建自己的模塊
那么,這如何幫助您更輕松地分發腳本?答案是第二種模塊:腳本模塊。這不過是一個普通的 Windows PowerShell 腳本,其文件擴展名為 .psm1,而不是一般的 .ps1。將 mymodule.psm1 放到 \modules 文件夾中之后,就可以運行 Import-Module MyModule,這將執行您的腳本。
通常,腳本模塊完全由函數組成。也就是說,在導入該模塊時,實際上不會執行任何操作,而僅僅將腳本模塊中的函數加載到 Shell 中,并供整個 Shell 使用。假設您有一個類似下面的腳本模塊:
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 {
}
}
此語句中聲明了三個參數:
computername 是一個字符串或字符串數組。該參數是強制性的,并且接受字符串管道輸入,這表示如果您傳送一組字符,這些字符將會自動放入 $computername 變量。
pingfirst 不是強制性的,但如果您確實要使用它,則應該使用 -PF 別名。這樣就可以少鍵入一些字母。這是一個開關參數,也即它不接受值。它要么打開,要么關閉。
class 也是強制性的,但您甚至不需要鍵入 -class 參數名。只需要在運行函數時,為該參數提供一個適當的值作為“第一個位置”值。雖然這是強制性的,但它接受空字符串。
聯機幫助中有更多屬性和大量示例。運行 help about_Functions_Advanced_Parameters 可以查看所有屬性和示例。
訪問公用參數
Shell 定義了多個由所有 Cmdlet 共享的公用參數。其中一個公用參數是 -verbose,用于告知 Cmdlet 輸出比平時更多的關于正在執行的操作的信息。但是,以下函數定義將導致錯誤:
function Test-Something {
[CmdletBinding()]
param (
[switch]$verbose
)
PROCESS {
}
}
這是因為您不能重新定義某個公用參數,如 -verbose。那么,如何知道運行的函數中是否包含 -verbose 呢?事實證明,這完全沒有必要。Windows PowerShell 會為您跟蹤該參數。您只需調用 Write-Verbose,如果 -verbose 未使用,Windows PowerShell 將忽略這些調用:
function Test-Something {
PROCESS {
Write-Verbose "Starting cmdlet"
}
}
test-something –verbose
確認影響
另一對公用參數是 -whatif 和 -confirm。對計算機進行某種更改的任何 Cmdlet 都應該識別這兩個參數。這對參數使您可以選擇是讓 Cmdlet 顯示通常執行的操作 (-whatif),還是讓 Cmdlet 分別確認每個操作 (-confirm)。這些參數統稱為 ShouldProcess,您可以聲明一個支持它們的函數,如下所示:
function Delete-Things {
[CmdletBinding(
SupportsShouldProcess=$true,
ConfirmImpact="Medium"
)]
PROCESS {
}
}
此聲明啟用 -whatif 和 -confirm 作為您函數的參數。此外,還指定您的函數對操作系統的影響級別為“Medium”。對于“Medium”的含義并沒有嚴格的指導原則 - 我認為它是指不太可能造成完全的災難。真實情況是 Shell 的 $ConfirmPreference 變量默認設置為“High”。當 Cmdlet 的影響小于 $ConfirmPreference 時,則 Cmdlet 運行時將不會進行確認,除非指定了 -whatif 或 –confirm。
如果 Cmdlet 的影響與 $ConfirmPreference 相同或者前者大于后者,則每次運行 Cmdlet 時,其行為將像指定了 –confirm 一樣,即使您忘記了指定亦如此。因此,如果您的函數將執行確實很危險 的操作,請將 ConfirmImpact 指定為“High”,以便 Cmdlet 始終請求確認。您還可以選擇“None”和“Low”。
實際上,Shell 的內置幫助不會向您說明如何要求確認 - 而這不是自動進行的。內置幫助建議您參考 MSDN 聯機幫助,而后者是面向 Microsoft .NET Framework 開發人員的,根本不涉及 Shell 的腳本編寫語言。因此,我將在這里告訴您如何要求確認:
function Delete-Things {
[CmdletBinding(
SupportsShouldProcess=$true,
ConfirmImpact="High"
)]
Param ($param1)
PROCESS {
if ($pscmdlet.ShouldProcess($param1)) {
Write "Deleting..."
}
}
}
Delete-Things "organizationalunit"
$pscmdlet 是一個內置變量,您可以在 PROCESS 腳本塊中使用它來訪問 Cmdlet 級別的功能,包括 ShouldProcess 方法。您傳送關于要修改內容的說明后,Shell 將負責顯示實際確認消息或“假設分析”消息。
如果 ShouldProcess 返回 $True,則您可以繼續。如果它返回 $False,則您不應執行準備要執行的任何操作。了解 $pscmdlet 變量后,將更容易理解那些 MSDN 開發人員文檔。這些文檔準確地描述了 ShouldProcess 及其配對方法(如 ShouldContinue)的不同用法。
求助!求助!求助!
切記,函數(甚至高級函數)可以將自身的內置幫助包含在特殊格式的注釋中,具體內容請參見我在 2010 年 3 月的專欄中的說明。通常,我會首先列出基于注釋的幫助,接著列出 CmdletBinding 語句和參數,最后列出 BEGIN{}、PROCESS{} 和 END{} 腳本塊。在函數中包含幫助始終 是一個好主意,您永遠不知道誰可能會從中受益。
如果您以前編寫過管道函數(也稱為“篩選函數”),則您已經了解編寫“腳本 Cmdlet”需要了解的所有其他事項。您的代碼包含在 PROCESS{} 腳本塊中,并且它將對流入您的 Cmdlet 的每個對象執行一次。關于這些高級函數的所有其他信息也像比它們稍微簡單的對應函數一樣。
Windows PowerShell v2 現已推出
盡管它預裝在 Windows Server 2008 R2 和 Windows 7 中,但 Windows PowerShell v2 及其附帶的 Management Framework 組件現在已經可以在 Windows XP、Windows Server 2003、Windows Vista 和 Windows Server 2008 上使用。請訪問 support.microsoft.com/kb/968929,以便獲取針對您使用的任何操作系統的下載鏈接。這應該與您的 v1 腳本兼容;因此,我將來的所有專欄將假設您使用的是 2.0。
廣泛的目標讀者
Windows PowerShell 團隊確實引以為豪的是使 Windows PowerShell 適用于擁有不同技能水平的大量目標讀者。高級函數毫無疑問就是只有高級 讀者才能體會到其用處的內容示例。
如果您是剛剛接觸 Shell,還需要時刻提醒自己運行幫助,那么高級函數可能要將來才用得上。您甚至不需要編寫高級函數,就可以成功使用 Shell。當您開始變得更專業并且開始編寫可重用的組件時,您會發現高級函數是一個不錯的選擇。
博客文章此處即是此方面的一個極好示例:首先顯示的是一個可完成重要任務的簡單命令 - 一個任何管理員都可能會編寫的命令。然后,作者逐漸將其命令的功能擴展為一個函數,接著擴展為篩選函數,最后擴展為高級函數,這顯示了 Shell 如何隨著您需求的增加和技能的提升而擴展。
Don Jones是 Concentrated Technology 的創始人,他會在ConcentratedTech.com 解答有關 Windows PowerShell 和其他技術的問題。他還是Nexus.Realtimepublishers.com的撰稿人,并且他的許多著作還在此網站上以電子版的形式提供。
相關內容
總結
以上是生活随笔為你收集整理的windows编写linux脚本,Windows PowerShell:共享您的脚本 - 在脚本中编写 Cmdlet | Microsoft Docs...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 拆分文件 多个,linux把
- 下一篇: linux mint 时间不对,Linu