我正在开发用于生成报告的PowerShell脚本,我正在加载并调用最终用户提供的模块。
首先,我调用用户提供的设置功能,然后加载模块:
# Load user provided modules
($userModules = Get-ChildItem ($userModHome + "*.psm1")) | ForEach-Object { Import-Module (join-path $userModHome $_.Name) } | Out-Null
调用设置和加载后,我遍历模块列表并调用每个模块。这一切都是直截了当的,但我想要完成的是不需要函数所需的全局变量。
我可以要求setup函数返回一个包含任何函数可能需要的所有内容的对象,然后将该数据结构传递给每个模块,但这可能会传递很多额外的东西。
我想知道是否有某种方法可以在运行时确定传递给模块的内容,或者在不使用全局变量的情况下动态加载和执行模块的其他优雅解决方案。
简而言之,我想我会问Powershell是否有反射可以用来确定模块的细节然后调用。我假设的困难部分是确定通过特定模块的参数。
答案 0 :(得分:1)
不确定完全理解您的问题,但这是在计算机上找到该模块的两种方法。
首先,您可以使用经典$env:PSModulePath
来存储客户端存储其模块的位置,只需添加额外的代码即可获取app本机模块。
第二,如果您将自己的代码作为模块提交,则可以按照此处的说明对其进行参数设置。
#REQUIRES -Version 2.0
#MyModule.PSM1
param ([strin]$ModulePath, [string] $choix)
switch ($choix)
{
"developpement" {Import-Module $ModulePath\Modules-0201.psm1 -Verbose}
"Integration" {Import-Module $ModulePath\Modules-0202.psm1 -Verbose}
default {Import-Module $ModulePath\Modules-0203.psm1 -Verbose}
}
您可以使用以下方式加载模块:
Import-Module .\Mydules.psm1 -ArgumentList "C:\Développements\Pgdvlp_Powershell\Apprentissage","developpement"
COMMENTAIRES : Chargement du module à partir du chemin
« C:\Développements\Pgdvlp_Powershell\Apprentissage\Modules-0201.psm1 ».
COMMENTAIRES : Exportation de la fonction « Bonjour ».
COMMENTAIRES : Importation de la fonction « Bonjour ».