必须将Powershell模块放在单独的文件夹中吗?

时间:2014-01-15 12:15:48

标签: powershell powershell-v2.0

使用PowerShell 2.0

根据我在网上看到的内容,用户创建的powershell模块必须各自驻留在它们自己的目录中。例如,如果我创建一个名为MyModule.psm1的模块,它必须位于名为MyModule的文件夹中,并驻留在$env:PSModulePath中列出的任何目录中。

如果我有一个项目的模块,我必须为每个模块创建一个单独的文件夹,这似乎很愚蠢。这真的是否必要?为什么?有什么优雅的方式吗?

3 个答案:

答案 0 :(得分:4)

如果您想拥有.psm1文件,可以通过提供文件本身的路径而不仅仅是模块的名称来导入它。

例如:

import-module c:\mymodules\folder\themodule.psm1

使用此技术,您可以在同一文件夹中拥有任意数量的模块。我不知道我会推荐这个,但确实有用。

答案 1 :(得分:1)

PowerShell模块可以包含多个文件,例如提供multi-language helpsplitting the functionality into several files。是的,这是必要的。

答案 2 :(得分:1)

这不理想,但您可以使用MSDN创建联结(Sysinternals junction.exe)。这将允许您将所有实际数据存储在一个文件夹中,但使用不同的路径引用它。

[MSDN] Hard Links and Junctions

假设您的.psm1目录中名为Modules的文件夹中有三(3)个独立$env:UserProfile\Documents\WindowsPowerShell\Modules模块文件。

Module Folder

您可以使用多个junction.exe命令创建指向文件系统上“真实”Modules文件夹的联结(链接)。

$ModulePath = '{0}\Modules' -f (Split-Path -Path $Profile.CurrentUserCurrentHost -Parent);
junction.exe $ModulePath\Foo $ModulePath\Modules;
junction.exe $ModulePath\Bar $ModulePath\Modules;
junction.exe $ModulePath\Trevor $ModulePath\Modules;

Junctions

以下是导航到其中一个交叉点时的样子,例如Foo

Junction

就Windows PowerShell而言,您位于Foo目录中,该目录与Foo.psm1文件名匹配。它应该忽略该文件夹中的其余文件。

现在,您可以运行Get-Module -ListAvailable,您应该会看到用户模块目录中的模块列表。

Get-Module -ListAvailable