當前位置:
首頁 > 最新 > Windows PowerShell進階 理解Module

Windows PowerShell進階 理解Module

上篇我們在操作excel文件的時候用到了別人寫好的module,我們在Windows PowerShell入門(19)腳本講腳本和profile的時候有提到過powershell module, 今天我們專門講下powershell module的知識點。主要參考微軟官方文檔,以下為翻譯。

概述

一個模塊是一組相關的Windows PowerShell功能,作為一個便捷單元組合在一起(通常保存在一個目錄中)。 通過將一組相關的腳本文件,程序集和相關資源定義為模塊,您可以比其他方式更容易地引用,載入,保留和共享代碼。

模塊的主要目的是允許Windows PowerShell代碼的模塊化(即重用和抽象)。 例如,創建模塊的最基本方法是將Windows PowerShell腳本簡單地保存為.psm1文件。這樣做可以讓您控制(即公開或私有)腳本中包含的函數和變數。 將該腳本另存為.psm1文件還允許您控制某些變數的範圍。 最後,您還可以使用諸如Install-Module之類的cmdlet來組織,安裝和使用腳本作為更大型解決方案的構建塊。

(編者:其實就是和java/python 中的import xxx; C#中的using XXX類似,可以當擴展插件理解)

模塊組件和類型(Module Components and Types)

一個模塊由四個基本組件組成:

某種代碼文件 - 通常是PowerShell腳本或託管cmdlets程序集。

上述代碼文件可能需要的其他內容,例如其他程序集,幫助文件或腳本。

描述上述文件的清單文件,以及存儲作者和版本信息等元數據。

一個包含所有上述內容的目錄,位於PowerShell可以合理找到它的位置。

請注意,這些組件本身都不是實際必需的。 例如,一個模塊在技術上可以只是一個存儲在.psm1文件中的腳本。 你也可以有一個模塊,只是一個清單文件,主要用於組織目的。 您也可以編寫一個動態創建模塊的腳本,因此實際上並不需要用於存儲任何內容的目錄。以下各節通過混合併匹配模塊的不同可能部分來描述可以獲取的模塊類型。

腳本模塊(Script Modules)

顧名思義,腳本模塊是一個包含任何有效的Windows PowerShell代碼的文件(.psm1)。腳本開發人員和管理員可以使用這種類型的模塊來創建模塊,其成員包括函數,變數等。從本質上講,腳本模塊只是一個具有不同擴展名的Windows PowerShell腳本,允許管理員在其上使用導入,導出和管理功能。

另外,您可以使用清單文件在模塊中包含其他資源,例如數據文件,其他依賴模塊或運行時腳本。清單文件對於跟蹤元數據(如創作和版本信息)也很有用。

最後,腳本模塊與其他未動態創建的模塊一樣,需要保存在PowerShell可合理髮現的文件夾中。通常,這是在PowerShell模塊路徑上;但如果有必要,您可以明確描述您的模塊安裝位置。有關更多信息,請參閱如何編寫PowerShell腳本模塊(文末有鏈接)。(圖片是我自己弄得,不是原文帶有的)

31-1 success-load-script-module

二進位模塊(Binary Modules)

二進位模塊是包含已編譯代碼(如C#)的.NET Framework程序集(.dll)。 Cmdlet開發人員可以使用此類模塊共享cmdlet,提供程序等。 (現有管理單元也可以用作二進位模塊。)與腳本模塊相比,二進位模塊允許您創建速度更快的cmdlet或使用功能(如多線程),這些功能在Windows PowerShell腳本中不易編碼。

和腳本模塊一樣,您可以包含一個清單文件來描述您的模塊使用的其他資源,並跟蹤有關您的模塊的元數據。 同樣,您可能應該將您的二進位模塊安裝在PowerShell模塊路徑某處的某個文件夾中。 有關更多信息,請參閱如何編寫PowerShell二進位模塊(文末有鏈接)。

(編者:以下代碼和圖片是我自己弄得,非原文所有)

我們把上面的C#代碼編譯成DLL(具體怎麼編譯,大家課外了解下)

然後我們把這個DLL重命名放在指定powershell module 目錄下,重開powershell,試著運行。

31-2 success-load-binary-module

清單模塊(Manifest Modules)

清單模塊是一個使用清單文件來描述其所有組件的模塊,但是沒有任何核心程序集或腳本。 (正式情況下,清單模塊將清單的ModuleToProcess或RootModule元素留空。)但是,仍然可以使用模塊的其他功能,例如載入相關程序集或自動運行某些預處理腳本的功能。 您還可以使用清單模塊作為便捷方式來打包其他模塊將使用的資源,例如嵌套的模塊,程序集,類型或格式。 有關更多信息,請參閱如何編寫PowerShell模塊清單。(文末有鏈接)。

動態模塊(Dynamic Modules)

動態模塊是不從模塊載入或保存到文件的模塊。 相反,它們是由腳本使用New-Module cmdlet動態創建的。 這種類型的模塊使腳本能夠按需創建模塊,而無需將其載入或保存到永久存儲器中。 就其性質而言,動態模塊的壽命較短,因此無法通過 cmdlets訪問。 同樣,他們通常不需要模塊清單,也不需要永久文件夾來存儲相關的程序集。

模塊清單(Module Manifests)

模塊清單是一個包含散列表的.psd1文件。 哈希表中的鍵和值執行以下操作:

描述模塊的內容和屬性。

定義先決條件。

確定組件的處理方式。

清單對於模塊不是必須的。 模塊可以引用腳本文件(.ps1),腳本模塊文件(.psm1),清單文件(.psd1),格式和類型文件(.ps1xml),cmdlet和提供程序集(.dll),資源文件,幫助文件,本地化 文件或捆綁在模塊中的任何其他類型的文件或資源。 對於國際化腳本,模塊文件夾還包含一組消息目錄文件。 如果將清單文件添加到模塊文件夾中,則可以通過引用清單來將多個文件作為單個單元引用。

清單本身描述了以下幾類信息:

關於模塊的元數據,例如模塊版本號,作者和描述。

導入模塊所需的先決條件,例如Windows PowerShell版本,公共語言運行庫(CLR)版本和所需的模塊。

處理指令,例如要處理的腳本,格式和類型。

限制要導出的模塊成員,例如要導出的別名,函數,變數和cmdlet。

有關更多信息,請參閱如何編寫PowerShell模塊清單。

保存和安裝模塊(Storing and Installing a Module)

一旦創建了腳本,二進位或清單模塊,就可以將工作保存在其他人可以訪問的位置。 例如,您的模塊可以存儲在安裝Windows PowerShell的系統文件夾中,也可以存儲在用戶文件夾中。

一般來說,您可以通過使用存儲在變數中的路徑之一來確定應安裝模塊的位置。 使用這些路徑之一意味著當用戶在其代碼中調用它時,PowerShell可以自動查找並載入您的模塊。 如果您將模塊存儲在其他位置,則在調用時,可以通過將模塊位置作為參數傳遞給PowerShell(如下)。

無論如何,文件夾的路徑稱為模塊的基礎(ModuleBase),腳本,二進位或清單模塊文件的名稱應與模塊文件夾名稱相同,但以下情況除外:

New-Modulecmdlet創建的動態模塊可以使用cmdlet的Name參數命名。

通過Import-Module -Assembly命令從彙編對象導入的模塊根據以下語法命名:「dynamic_code_module_」+ assembly.GetName()。

模塊命令集和變數(Module Cmdlets and Variables)

Windows PowerShell提供了以下cmdlets和變數,用於創建和管理模塊。

cmdlet

此cmdlet創建僅存在於內存中的新動態模塊。 該模塊是從腳本塊創建的,並且其導出的成員(例如其函數和變數)在會話中立即可用並保持可用,直到會話關閉。

cmdlet

此cmdlet創建一個新的模塊清單(.psd1)文件,填充其值,並將清單文件保存到指定的路徑。 此cmdlet也可用於創建可手動填寫的模塊清單模板。

cmdlet

此cmdlet將一個或多個模塊添加到當前會話。

cmdlet

此cmdlet檢索有關已經或可以導入當前會話的模塊的信息。

cmdlet

此cmdlet指定從腳本模塊(.psm1)文件或通過使用New-Module cmdlet創建的動態模塊導出的模塊成員(如cmdlet,函數,變數和別名)。

cmdlet

此cmdlet從當前會話中刪除模塊。

cmdlet

此cmdlet通過驗證模塊清單文件(.psd1)中列出的文件實際存在於指定路徑中來驗證模塊清單是否準確地描述了模塊的組件。

$PSScriptRoot

該變數包含正在執行腳本模塊的目錄。它使腳本能夠使用模塊路徑訪問其他資源。

$ENV:PSModulePath

此環境變數包含存儲Windows PowerShell模塊的目錄列表。自動導入模塊並更新模塊的幫助主題時,Windows PowerShell將使用此變數的值。

編者總結

不知道大家看下來有沒有什麼想法,反正我自己是有一個疑問:Module和Profile有什麼區別?

我們在Windows PowerShell入門(19)腳本介紹過powershell的profile文件,其也可以在powershell運行時自動載入profile裡面定義好的無論函數還是變數。如下所示,我們將之前的module文件夾暫時移除,然後將module裡面的函數寫到profile.ps1裡面,然後重新打開powershell。

31-3 load-same-function-from-profile

可以看到效果是一樣的,那麼我們為什麼還要用module呢?後來在看官網文檔和寫這篇文章的時候多少有點體會了,抬杠一點說是的,你代碼寫在module還是profile裡面都能夠成功運行。但是Module的主要目的是為了代碼的模塊化以及其內部控制的私有化/公有化。

模塊化

這意味著代碼更加容易維護和遷移,如果所有功能都寫在一個profile裡面,那麼出錯的時候不好debug。而且當你給別人用特定功能的時候,module可以直接copy對應的module文件夾給別人,但是profile因為裡面還有別的功能的函數,直接給別人用的話,顯然不是我們想要的結果。單獨挑出來特定函數又費力不討好,還容易遺漏出錯。大家可以看下上篇我們用的importexcel的module有多少個文件和函數。 現在還覺得把這些功能都寫在profile裡面可行嗎?

參考鏈接

https://msdn.microsoft.com/en-us/library/dd878324(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/dd878340(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/dd878342(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/dd878337(v=vs.85).aspx

https://msdn.microsoft.com/en-us/library/dd878343(v=vs.85).aspx

今天稍微講了下Module的知識,但是我知道肯定說的不夠全面,大家有時間還是要多看看微軟的官方文檔,多敲敲代碼加深理解。

相關代碼等文件已上傳 https://gitee.com/chaoyuew/powershell/tree/feature/wechat/SPPS31


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 全球大搜羅 的精彩文章:

《西部世界》本季第十集提前觀劇現場
正能量經典語錄,早上的問候

TAG:全球大搜羅 |