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

时间:2018-08-15 19:40:10

标签: powershell powershell-v5.0 powershell-ise import-module

我对自定义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:驱动器中不存在。

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

1 个答案:

答案 0 :(得分:0)

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

C:\Your\Path\To\Script\YourScript.ps1
C:\Your\Path\To\Script\Libraries\allYourPsmModules.psm1

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

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 $scriptDir\Libraries\Import-Libraries.psm1
Import-Libraries .\Libraries

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