使用 PowerShellGet 安装 PowerShell 模块后写入配置文件
Write to Profile File After Installing PowerShell Module with PowerShellGet
我有一个带有两个 cmdlet 的自定义 PowerShell 模块。我已成功将其手动部署到我的机器上。但是,我通过将二进制文件和模块清单放在一个位置,然后注册模块来部署它。我还必须手动将 Import-Module
命令写入我的 'all users' 配置文件。
现在我确定我可以使用 Publish-Module
部署此模块,但是如何让 Install-Module
将 Import-Module
语句写入配置文件?
从 PowerShell 3.0 开始,当调用来自模块的命令时,模块会自动导入。这对微软来说是一个绝妙的选择;但是,它确实要求模块位于 PowerShell 默认查找模块的位置。说得通。您可以通过 运行 以下命令查看这些位置:
$env:PSModulePath -split ';'
您是否有理由不使用上述环境变量中存储的路径之一?也就是说,我会将您的代码 放在 "C:\Windows\System32..." 路径的 之外。其他选项更好:"C:\Program Files\PowerShell\Modules" (AllUsers) 和 "C:\Users\tommymaynard\Documents\PowerShell\Modules" (CurrentUser)。根据您的 PowerShell version/OS,这些路径可能不同。如果您将模块放入首选位置,则无需将 Import-Module 命令写入 $PROFILE 脚本。也许您已经知道这一点,但也许还不知道。
您不会让 Install-Module 写入任何 $PROFILE 脚本。
$PROFILE | Select-Object -Property *
好吧,反正不是默认的。您可以编写自己的 Install-Module 函数,它运行 PowerShellGet 的 Install-Module 函数,并包括写入各种 $PROFILE 脚本。问题是您需要包含逻辑,这样您就不会破坏某人的 $PROFILE 脚本的内容(如果它不为空),并且只附加到它。
说真的,当您将模块放到 PowerShell 可以自行找到它的位置时,这会变成很多工作。
编辑:我突然想到,可以在$env:PSModulePath环境变量中加一个value/path。这是一个带分号分隔符的字符串:
$env:PSModulePath.GetType().Name
因此,它看起来像这样:
$env:PSModulePath += ';C:\Another\Path'
太棒了,但是你又会怎么安排呢,对吧?它会将您带回到写入所有 $PROFILE 脚本的问题,...尽管您可以通过组策略首选项更新变量。同样,最好只是重新定位您的模块。
我有一个带有两个 cmdlet 的自定义 PowerShell 模块。我已成功将其手动部署到我的机器上。但是,我通过将二进制文件和模块清单放在一个位置,然后注册模块来部署它。我还必须手动将 Import-Module
命令写入我的 'all users' 配置文件。
现在我确定我可以使用 Publish-Module
部署此模块,但是如何让 Install-Module
将 Import-Module
语句写入配置文件?
从 PowerShell 3.0 开始,当调用来自模块的命令时,模块会自动导入。这对微软来说是一个绝妙的选择;但是,它确实要求模块位于 PowerShell 默认查找模块的位置。说得通。您可以通过 运行 以下命令查看这些位置:
$env:PSModulePath -split ';'
您是否有理由不使用上述环境变量中存储的路径之一?也就是说,我会将您的代码 放在 "C:\Windows\System32..." 路径的 之外。其他选项更好:"C:\Program Files\PowerShell\Modules" (AllUsers) 和 "C:\Users\tommymaynard\Documents\PowerShell\Modules" (CurrentUser)。根据您的 PowerShell version/OS,这些路径可能不同。如果您将模块放入首选位置,则无需将 Import-Module 命令写入 $PROFILE 脚本。也许您已经知道这一点,但也许还不知道。
您不会让 Install-Module 写入任何 $PROFILE 脚本。
$PROFILE | Select-Object -Property *
好吧,反正不是默认的。您可以编写自己的 Install-Module 函数,它运行 PowerShellGet 的 Install-Module 函数,并包括写入各种 $PROFILE 脚本。问题是您需要包含逻辑,这样您就不会破坏某人的 $PROFILE 脚本的内容(如果它不为空),并且只附加到它。
说真的,当您将模块放到 PowerShell 可以自行找到它的位置时,这会变成很多工作。
编辑:我突然想到,可以在$env:PSModulePath环境变量中加一个value/path。这是一个带分号分隔符的字符串:
$env:PSModulePath.GetType().Name
因此,它看起来像这样:
$env:PSModulePath += ';C:\Another\Path'
太棒了,但是你又会怎么安排呢,对吧?它会将您带回到写入所有 $PROFILE 脚本的问题,...尽管您可以通过组策略首选项更新变量。同样,最好只是重新定位您的模块。