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