powershell共享服务器写文件,Windows PowerShell:共享您的脚本 - 轻松实现
Windows PowerShell:共享您的腳本 - 輕松實現
08/17/2016
本文內容
Don Jones
Windows PowerShell v1 的一項限制是它不能輕松實現腳本共享。當然,您可以輕松將 .ps1 腳本文件復制到另一臺計算機,甚至將其壓縮起來并通過電子郵件發送給同事,可是早在十年前您就能對 VBScript 執行這樣的操作了。但是如果您的腳本包含可重用的函數,收到該腳本的人就必須知道如何對其執行 dot-source 操作,否則就必須對其進行修改才能執行那些函數。
總而言之,雖然并不理想,但這種情況還是可以接受的。但是對于伴隨著自定義格式視圖或類型擴展的腳本而言,這種情況就不那么容易接受了,因為那些額外的文件不得不手動加載到 Shell 中,才能被腳本所使用。
而由于 Windows PowerShell v2 引入了模塊,我們幾乎實現了一種理想狀況。
獨立 Shell 塊的優點
模塊只不過是一組相互關聯的文件。有兩類廣義的模塊:二進制文件和腳本。
二進制模塊包含一個或多個 DLL 文件,這些文件是從 C#、Visual Basic 等 Microsoft .NET Framework 語言編譯生成的。在 v1 的時代,我們把這些文件稱為 PSSnapin。事實上,Visual Studio 中編寫這樣的文件沒有很大的變化。但是,管理單元還要求您編寫一個安裝程序,以便在 Shell 中注冊您的 DLL。而對于模塊,不需要進行安裝。模塊附帶了一個 .psd1 文件 - 模塊清單。清單只是一些 XML 代碼,這些代碼指示應該加載哪些 DLL。清單還可以指定附帶的類型擴展文件 (.ps1xml) 或視圖文件 (.format.ps1xml)。
下面介紹它的工作原理:模塊必須安裝在 Windows PowerShell \modules 文件夾的子目錄中。默認情況下,此文件夾位于 c:\windows\system32\windowspowershell\v1.0\modules 中。因此,名為“MyModule”的模塊將位于 c:\windows\system32\windowspowershell\v1.0\modules\mymodule 中,而其清單文件為 mymodule.psd1。與模塊相關的任何文件通常分組放在同一個文件夾中,從而使所有內容均自我包含。
若要加載模塊,您只需運行 Import-Module MyModule。默認情況下,Shell 將查看 \modules 文件夾(但如果您的模塊位于其他位置,您也可以向 Import-Module 傳遞完整的路徑),查看是否存在 .psd1 文件,讀取該文件,并加載該文件中引用的文件。分發模塊非常輕松:只需將所有文件壓縮起來,并將 .zip 文件復制到另一臺計算機,而無需進行安裝。
動手創建自己的模塊
那么,這如何幫助您更輕松地分發腳本?答案是第二種模塊:腳本模塊。這不過是一個普通的 Windows PowerShell 腳本,其文件擴展名為 .psm1,而不是一般的 .ps1。將 mymodule.psm1 放到 \modules 文件夾中之后,就可以運行 Import-Module MyModule,這將執行您的腳本。
通常,腳本模塊完全由函數組成。也就是說,在導入該模塊時,實際上不會執行任何操作,而僅僅將腳本模塊中的函數加載到 Shell 中,并供整個 Shell 使用。假設您有一個類似下面的腳本模塊:
Function Get-Inventory {
# (some code goes here)
}
Function Test-Connectivity {
# (some code goes here)
}
Function Write-Inventory {
# (some code goes here)
}
導入此模塊將使 Get-Inventory、Test-Connectivity 和 Write-Inventory 函數可供整個 Shell 使用,就像 cmdlet 一樣(事實上,我將在下個月講解如何編寫函數,使其幾乎完全像“真的”cmdlet 一樣)。您的函數甚至能包含基于注釋的幫助(我在上一期專欄中進行了演示),這樣其他人就可以導入該模塊,并運行 Help Get-Inventory 來查看有關使用該函數的說明。
您有時需要一些私密性
有時您可能會擁有一個復雜的腳本模塊,其中包含一些函數,僅供其他函數使用,而不由用戶使用。例如,我可能希望 Test-Connectivity 和 Write-Inventory 是模塊所“私有”的。這意味著它們將被 Get-Inventory 調用,但我不希望它們直接被 Shell 用戶調用。
默認情況下,Import-Module 會導入模塊中的所有內容,從而使 Shell 用戶能夠看到所有函數。只需指定您希望對用戶可見的函數列表,即可替代此行為;除了您指定的函數以外,Shell 用戶將無法看到其他任何內容。為此,只需在腳本模塊末尾執行 Export-ModuleMember:
Export-ModuleMember –function Get-Inventory
如果需要,您還可以導出腳本中定義的 cmdlet、變量和別名。 有關詳細信息,請運行 Help Export-ModuleMember 或查看 Export-ModuleMember。
模塊的不足
對于我來說,v2 模塊唯一令人失望的是 Shell 似乎只有一個默認模塊位置,而且該位置位于 Windows 系統文件夾下 - 您肯定不希望養成修改此文件夾的習慣。但是隨后我查看了 PSModulePath 環境變量,并發現 Shell 還會查看您的“文檔”文件夾(位于名為 WindowsPowerShell\Modules 的子文件夾中)。現在,我將我編寫的所有模塊都存放在該文件夾中。
將來,您很可能會看到 cmdlet 從基于 Internet 的資源庫下載更多模塊,而不像 Unix 系統中的 Pear 功能一樣。這樣的 cmdlet 更有可能會下載到您的“文檔”文件夾或其他非操作系統的位置,因此讓 Shell 在您的“文檔”文件夾中搜索模塊是一種相當聰明的默認設置。
到處都是模塊
由于它們不需要安裝就能被 Shell“看到”,因此模塊的使用越來越多。事實上,在 Windows Server 2008 R2 中,幾乎所有 Windows PowerShell 擴展都被封裝為模塊 - 唯一的例外是用于自動執行 Windows Server 備份的 PSSnapin(請運行 Get-PSSnapin –registered 來查看它是否安裝在服務器上)。而以模塊的形式發布的第三方代碼更多,包括需要通過 PoshCode.org 訪問社區代碼資源庫的 cmdlet。
事實上,如果您是一位經驗豐富的 Windows PowerShell 用戶,希望編寫自己的 cmdlet,但是不希望深入研究 Visual Studio 中的 .NET Framework 編程,則高級函數(這是下個月的專欄主題)和模塊的組合將使您能夠完全用腳本來編寫自己的 Shell 管理單元。只需將您的高級函數(外觀和功能均與 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。
Don Jones是 Concentrated Technology 的創始人,他會在ConcentratedTech.com 解答有關 Windows PowerShell 和其他技術的問題。他還是Nexus.Realtimepublishers.com的撰稿人,并且他的許多著作還在此網站上以電子版的形式提供。
相關內容
總結
以上是生活随笔為你收集整理的powershell共享服务器写文件,Windows PowerShell:共享您的脚本 - 轻松实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序服务器开小差了,微信小程序wx
- 下一篇: 服务器异常下电文件系统,SUN服务器So