2016-08-23 64 views
1

我們已經積累了一堆腳本,每個腳本看起來都像CmdLets,即它有一組聲明的參數,然後立即調用一個執行該工作的Main函數,調用其中的私有子函數。我可以從一堆單功能腳本創建一個模塊嗎?

一個例子是Remove-ContentLine.ps1它只是吐出一個文件或管道輸入的內容,除了匹配某些模式的行。

所以他們就像小「功能腳本」。

有沒有什麼辦法可以將這些腳本聚合到一個模塊中,同時也可以像保存文件一樣保持它們?

編輯

如果你的直覺是,它更容易只是複製粘貼,並將它們重構爲一個psm1然後只是說;)

+0

嘗試讀取循環中的所有文件,提取函數名稱,通過點源執行,然後使用提取的名稱執行'Export-ModuleMember'。 – wOxxOm

回答

1

你問:

有什麼辦法,我可以聚合這些腳本到一個模塊中,同時也 保持他們,正是因爲他們在文件嗎?

但我確定是而不是你真正想要的。如果是這樣,那麼當您加載模塊時,您的代碼的所有將立即執行!相反,我認爲你想要的是你的每個腳本都應該包含在一個函數中;那麼當您導入模塊時,該組函數將被加載;然後您可以按需執行您的任何功能。

的過程是非常簡單的,我已經寫了大量的文章是如何做到這一點(Further Down the Rabbit Hole: PowerShell Modules and Encapsulation),但我會總結在這裏:

(1)編輯每個文件的全部內容包裝成一個功能並以輸出功能結束。我會建議根據文件名命名該功能。因此,Remove-ContentLine.ps1應如下所示:

function Remove-ContentLine() 
{ 
    # original content of Remove-ContentLine.ps1 here 
} 
Export-ModuleMember Remove-ContentLine 

(2)確定模塊的名稱並創建該名稱的目錄。我們稱之爲MyModule。在MyModule目錄中,創建一個子目錄以放置所有.ps1文件;我們稱之爲ScriptCmdlets

(3)內MyModule其內容創建一個模塊文件MyModule.psm1會正是這一點:

Resolve-Path $PSScriptRoot\ScriptCmdlets\*.ps1 | 
? { -not ($_.ProviderPath.Contains(".Tests.")) } | 
% { . $_.ProviderPath } 

是的,每個模塊(名爲.psm1)文件我寫的包含了相同的代碼!

(4)使用New-ModuleManifest cmdlet在MyModule內創建模塊清單MyModule.psd1

然後使用你的模塊,只需使用Import-Module。但我強烈建議您閱讀我的文章以獲取更多詳細信息,以更好地瞭解該過程。

0

我懷疑,你可以,如果腳本已經執行的東西(「主」) 。如果他們僅爲Remove-ContentLine.ps1公開Remove-ContentLine這樣的函數,則可以使用單個腳本中的所有腳本來源代碼來聚合它們,或者在使用模塊清單時使用ScriptsToProcess = @()部分。

0

我認爲最好是將每個.ps1中的函數重構爲合適的模塊。它應該基本上只是將腳本複製/粘貼到一個.psm1文件併爲其創建.psd1文件。一定要檢查並正確處理腳本或全局範圍內設置的任何內容,並且函數之間不存在命名衝突。

如果您擁有Sapien PowerShell Studio,則在「文件」菜單中會有一個「功能中的新模塊」選項,可幫助您自動完成大部分功能。

相關問題