PowerShell 模块 - 在何处存储自定义生成的模块以及如何使用 profile.ps1 导入它们



我对在哪里存储我的自定义Powershell模块有点困惑。

这是我Utility.psm1的一个例子

New-Module -Name 'Utility' -ScriptBlock {
function New-File($filename)
{
if(-not [String]::IsNullOrEmpty($filename))
{
New-Item -ItemType File "$filename"
} else {
Write-Error "function touch requires filename as a parameter"
}
}
function Change-DirectoryUp($number)
{
for($i=0; $i -lt $number; $i++)
{
if((pwd).Path -eq 'C:') { break } else { cd .. }
}
}
function Get-EnabledWindowsFeatures()
{
$features = Get-WindowsOptionalFeature -Online
$features | ? {$_.State -eq 'Enabled'} | select FeatureName
}
}

如果我想在每次打开Powershell或Powershell ISE时导入此模块,我该怎么做?我在哪里存储Utility.ps1重要吗?我想避免传递此文件的完整路径...但我担心使用相对路径会依赖于"开始"路径。

我注意到有一个名为$env:PSModulePath的变量,但该目录的路径在我的 C: 驱动器中不存在。

我应该创建该目录并将它们存储在那里吗?如果我这样做,如何导入模块?

我的解决方案是将所有 psm1 模块与脚本一起保留一个库文件夹,并在每次编写新脚本时重复使用它。为此,可以使用 $myInvocation 变量,因为它相对于正在运行的脚本文件所在的位置。我所做的是具有以下结构:

C:YourPathToScriptYourScript.ps1
C:YourPathToScriptLibrariesallYourPsmModules.psm1

我有一个名为 Import-Libraries.psm1 的模块,它存储在库文件夹下,包含以下代码:

Function Global:Import-Libraries {    
param (
[string] $LibrariesPath
)    
foreach ($module in (Get-ChildItem -Path "$LibrariesPath./*.psm1" -File)) {
Import-Module ($module).FullName -Force
}
}

然后,脚本需要从以下内容开始:

$scriptDir = (split-path -parent -path $MyInvocation.MyCommand.Path)
Import-module $scriptDirLibrariesImport-Libraries.psm1
Import-Libraries .Libraries

这三行的作用是$scriptDir成为相对路径,因此将脚本存储在何处无关紧要。然后,我导入名为"导入模块"的模块,然后在库文件夹上运行该模块。名为导入库的模块将始终导入我在文件夹库下拥有的所有库,因此添加新库将始终自动完成。

最新更新