2016-01-21 43 views
0

我在非標準路徑下有一個模塊(MyModule),即不在$env:PSModulePath -split ";"中列出的通常位置下。但是,我已將「生產」路徑添加到該環境變量MyModule,同時繼續處理「開發」副本。導入模塊詳細輸出意味着模塊被加載兩次

雖然試圖調試的東西,我裝使用下面的命令模塊(帶$VerbosePreference = "Continue"),並立即看到詳細輸出的兩個看似矛盾的臺詞:

[D:\Dev\UserA\]> Import-Module D:\Dev\UserA\libs\PowerShell\MyModule 

VERBOSE: Loading module from path 'D:\Dev\UserA\libs\PowerShell\MyModule\MyModule.psd1'. 
VERBOSE: Loading module from path 'D:\Dev\usera\MyModule2\MyModule.psm1'. 

我想明白爲什麼導入模塊出現要加載模塊兩次,尤其是當第二個路徑不正確時。


更詳細地:

用於模塊的文件夾結構是:

MyModule\MyModule.psd1 
MyModule\MyModule.Test-Module.xml 
MyModule\MyModule1\MyModule.psm1 
MyModule\MyModule2\MyModule.psm1 

注(1)I在一個MyModule1子文件夾下保持該模塊的舊 「版本1」並將我更新後的「版本2」文件放入MyModule2子文件夾中,以及(2)自定義模塊測試腳本使用.xml文件列出測試用例。我很確定後者可以被忽略。

我的模塊清單(的.psd1)文件包含以下,與所有其他行是空白或註解:

@{ 
    RootModule = '.\MyModule2\MyModule.psm1' 
    ModuleVersion = '2.0.0.0' 
    GUID = 'aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee' 
    Author = 'Old Developer (v1.x) & New Developer (v2.x)' 
    CompanyName = 'MyCompany' 
    Copyright = '(c) 2013-2015 MyCompany. All rights reserved.' 
    Description = 'Really useful functions' 
    FileList = @(
    '.\MyModule.psd1' 
    '.\MyModule.Test-Module.xml' 
    '.\MyModule1\MyModule.psm1' 
    '.\MyModule2\MyModule.psm1' 
    '.\MyModule2\Examples\Archive-FilesWithCompression.ps1' 
) 
} 

的文件顯然我已經使用相對路徑,ESP。 RootModule key;這是必要的,因爲我無法確定模塊在分享時將被複制到何處。回到Verbose輸出,我可以看到兩行顯示(1)PSD1文件的正確路徑和(2)PSM1文件的無效路徑。我確實注意到第二條路徑的用戶名是小寫的,這正是我在測試之前碰巧輸入的名稱。因此,看起來第一個路徑是通過將MyModule.psd1附加到給定的Import-Module cmdlet的路徑來實現的,第二個路徑是(Get-Location)和RootModule路徑的串聯。

這似乎只發生在這個模塊。我沒有出現這種行爲的同一個「根」文件夾下的其他人。

回答

0

嗯。好。我可能已經完成了,至少部分是...

我不小心在我運行Import-Module cmdlet的位置下的位置下創建了MyModule2子文件夾的副本。一旦我刪除該文件夾的詳細輸出開始更有意義:

[D:\Dev\UserA\]> Import-Module D:\Dev\UserA\libs\PowerShell\MyModule 

VERBOSE: Loading module from path 'D:\Dev\UserA\libs\PowerShell\MyModule\MyModule.psd1'. 
VERBOSE: Loading module from path 'D:\Dev\UserA\libs\PowerShell\MyModule\.\MyModule2\MyModule.psm1'. 
VERBOSE: Exporting function '<function>'. 
.... 

我想這意味着,當PowerShell中解析RootModule清單文件,它看起來在當前路徑下,然後再主模塊文件夾如果沒有發現。我發現這種反直覺,因爲我期望清單中的任何相對路徑總是相對於PSD1文件而不是當前位置。

如果我再嘗試導入模塊再次立即我得到這個:

[D:\Dev\UserA\]> Import-Module D:\Dev\UserA\libs\PowerShell\MyModule 

VERBOSE: Loading module from path 'D:\Dev\UserA\libs\PowerShell\MyModule\MyModule.psd1'. 
VERBOSE: Importing function '<function>'. 
.... 

也就是說,只有一個「加載模塊」行,而不是詳細輸出的兩行。然後,我嘗試了-Force開關,得到了以下幾點:

[D:\Dev\UserA\]> Import-Module D:\Dev\UserA\libs\PowerShell\MyModule -Force 

VERBOSE: Loading module from path 'D:\Dev\UserA\libs\PowerShell\MyModule\MyModule.psd1'. 
VERBOSE: Removing the imported "<function>" function. 
.... 
VERBOSE: Loading module from path 'D:\Dev\UserA\libs\PowerShell\MyModule\.\MyModule2\MyModule.psm1'. 
VERBOSE: Exporting function '<function>'. 
.... 
VERBOSE: Importing function '<function>'. 
.... 

所以,似乎詳細輸出的兩行出現在模塊首次被導入,或強行重新進口,但如果它已經的一部分屆時你只會看到第一行。

而且,我終於發現了那出口功能和進口他們之間的區別詳細輸出。這些功能是導出的,它們是按照它們在PSM1文件中定義的順序排列的,但按字母順序依次導入。這表明使用一個或兩個階段的過程,取決於是否從PSM1文件重新讀取函數定義,與我們是否看到一行或兩行詳細輸出相關。

或者,爲了更直接地回答這個問題,當需要讀取.psm1文件時,似乎有兩行顯示「加載模塊...」,並且PowerShell已經知道該模塊時只有一行及其內容。