2

我正在编写用于生成报告的 PowerShell 脚本,我正在加载和调用最终用户提供的模块。

首先我调用用户提供的设置函数,然后加载模块:

# Load user provided modules
($userModules = Get-ChildItem ($userModHome + "*.psm1")) | ForEach-Object { Import-Module (join-path $userModHome $_.Name) } | Out-Null

调用 setup 和 loading 后,我遍历模块列表并调用每个模块。这一切都是直截了当的,但我想要完成的不是函数需要的所有东西都需要全局变量。

我可以要求 setup 函数返回一个包含任何函数可能需要的所有内容的对象,然后将该数据结构传递给每个模块,但这可能会传递很多额外的东西。

我想知道是否有某种方法可以在运行时确定将什么传递给模块,或者其他一些优雅的解决方案来动态加载和执行模块而不使用全局变量。

简而言之,我想我在问 Powershell 是否有反射可用于确定模块的详细信息然后调用。我假设的困难部分是确定传递特定模块的参数。

4

1 回答 1

1

不确定是否完全理解您的问题,但这里有两种在计算机上查找模块的方法。

首先,您可以使用classic$env:PSModulePath来存储客户端存储他的模块的地方,只需添加额外的代码来获取appart Microsoft原生模块。

其次,如果您将自己的代码作为模块交付,则可以如下所示对其进行参数化。

#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 ».
于 2012-05-08T09:51:50.023 回答