2015-05-25 40 views
1

你們知道嗎,是否可以將僅由功能組成的PowerShell項目轉換爲模塊?我想要實現的是創建我所有功能的可分配模塊,以便其他人可以使用它。但是不花費時間將所有函數轉換爲cmdlet。如何將一組腳本文件轉換爲模塊?

我的每個功能都在單獨的文件中。當我創建* .psd1並嘗試通過「FunctionsToExport」包含函數時,它不起作用。加載模塊後,我看不到我的功能。

當它們不是(所有它們)在.psm1文件中時,它甚至可以從模塊中導出函數嗎?我仍然試圖找出真正的差異,並使用* psd1和* psm1文件。

+0

什麼是「powershell項目」?你的意思是一些特定的文件類型或只是一個你一直在處理的抽象項目? –

+0

抽象的項目。在這種情況下,PowerShell項目=一組函數。 –

回答

3

是的,您可以將一堆.ps1文件轉換爲模塊。在模塊目錄$env:USERPROFILE\Documents\WindowsPowerShell\Modules中創建一個新文件夾,並將所有.ps1文件放在該文件夾中。同時文件夾中創建兩個文本文件<foldername>.psm1<foldername>.psd1,讓你有這樣的結構:

$env:USERPROFILE 
`-Documents 
    `-WindowsPowerShell 
    `-Modules 
     `-MyModule +-MyModule.psd1 +-MyModule.psm1 +-script1.ps1 +-script2.ps1 : `-scriptN.ps1

放入.psm1文件以下行,所以它「進口」的所有.ps1文件:

Get-ChildItem -Path "$PSScriptRoot\*.ps1" | % { . $_.FullName } 

,並指定在module manifest(該.psd1文件)元數據,例如:

@{ 
    ModuleToProcess = 'MyModule.psm1' 
    ModuleVersion  = '1.0' 
    GUID    = '6bc2ac1e-2e88-4bc3-ac84-ecd16739b6aa' 
    Author   = 'Matthew Lowe' 
    CompanyName  = '...' 
    Copyright   = '...' 
    Description  = 'Description of your module.' 
    PowerShellVersion = '2.0' 

    FunctionsToExport = '*' 
    CmdletsToExport = '' 
    VariablesToExport = '' 
    AliasesToExport = '' 
} 

GUID可以通過例如[guid]::NewGuid()生成。

+0

令人驚歎的答案。謝謝。對我來說缺少鏈接是ModuleToProcess ='MyModule.psm1'。默認* psd1文件不包含它。我試圖從這個文件中點源文件,但顯然,它從來沒有被調用過。 –

1

這裏做一個非常簡單的方法,沒有包括通過點採購模式的功能,因爲它在其他答案的完成:

  1. 創建一個文件夾C:\MyModules
  2. 在此文件夾中,創建一個文件名爲MyModules.PSM1
  3. 附加到MyModules.PSM1文件,模塊中需要的所有功能(它們不需要高級化)。
  4. 您已完成

現在,你有一個文件夾(C:\MyModules),您必須在目標計算機上安裝。

要將其安裝到目標機器(每個用戶),請將文件夾C:\MyModule複製到用戶的默認模塊位置(即文件夾):$home\Documents\WindowsPowerShell\Modules。現在

,該用戶可以在任何PowerShell會話包括你的模塊任何功能的第一個字母(S)型,即PowerShell的智能感知將認識到從你的模塊功能(和uggest完成子)。

如果你不喜歡這個名字MyModule的,你可以改變它,只要你更改文件夾的名稱,以及該PSM1文件名。

您也可以選擇安裝您的模塊全部用戶:help about_modules。

+4

這實際上是我想避免的。將所有功能放到單個文件中對我來說是不可接受的。對這樣的文件和代碼進行代碼評論真的很難。除此之外,我想在我的函數中保留特定的目錄結構。我來自java世界,我傾向於保留它們所屬的'包'或目錄中的函數。core/utils/network等。 –

+0

那麼,你決定什麼對你更好。我告訴你如何以一種非常簡單的方式實現你所要求的**。該模塊就是一個模塊,以及它的內容是如何排序的,不會引起任何人的興趣。在你身邊,你的代碼將以你喜歡的方式導致該模塊,按你喜歡的方式排列。使用它們作爲源代碼,你可以建立一個模塊,這個模塊如何包含代碼對任何人都無關緊要,甚至可以改變你對源代碼的定義(當然,它們是與模塊分開的)。我告訴過你如何以一種非常簡單的方式建立一個模塊**。 –

+0

那麼,如果包含所有函數,目前在單獨的文件中,則單個* .psm1文件實際上幾乎影響它們的順序:-)。從一般的觀點來看,你的回答是正確的,但是它不回答我原來的問題。從原來的問題:「當它們不是(全部)在.psm1文件中時,它甚至可以從模塊中導出函數?」。對不起,如果我的評論以任何方式給你。爲此我表示歉意。我仍然非常感謝你的回答,謝謝。 –

相關問題