代码之家  ›  专栏  ›  技术社区  ›  Usman

powershell如何知道在哪里可以找到要导入的模块?

  •  1
  • Usman  · 技术社区  · 8 年前

    我真的是初级水平的工作与命令和powershell的东西。我正在使用powershell api从c调用commandlet。我看到了奇怪的行为。在stackoverfow的不同线程上,人们使用import命令或psimportmodule方法显式地导入模块,我可以看到$env:psmodulepath处是否已经有可用的程序集,它将自动加载。这种行为是默认的还是由于我忽略的标准配置。我在ms测试环境中运行单元测试。

    我正在使用以下代码。

     System.Management.Automation.PowerShell _powerShellInstance
     _powerShellInstance.AddCommand("Connect-AzureRmAccount", false);
     var output = _powerShellInstance.Invoke();
    
     // Invoking my commandlets
    
     _powerShellInstance.AddCommand("Get-LinkParameter", false); 
    

    上面的命令自动从 C:\Windows\system32\WindowsPowerShellModules\v1.0\Modules\ .我没有创建任何运行空间和配置集。就在自动加载的上面。我需要确认powershell和run space的具体行为。因为我需要弄清楚如何在生产机器上安装我的命令。生产机器上的单元测试将如何访问我的commandlets以完全加载。

    1 回复  |  直到 8 年前
        1
  •  1
  •   codewario    8 年前

    虽然最好使用显式加载要使用的模块 Import-Module ,因为powershell 3.0,如果模块在 $env:PSModulePath ,默认情况下,如果调用了它的某个cmdlet,它将自动加载。以下是不同路径的细分:

    用户模块

    $modulePath = "${env:UserProfile}\Documents\WindowsPowerShell\Modules" 此处安装的模块仅对当前用户的powershell会话可用,默认情况下,使用 Install-Module 都保存在这里。

    所有用户模块

    $modulePath = "${env:ProgramFiles}\WindowsPowerShell\Modules" 此处安装的模块可用于任何用户的powershell会话。

    系统模块

    $modulePath = "${env:SystemRoot}\system32\WindowsPowerShell\v1.0\Modules" 此处安装的模块在系统范围内可用于任何powershell会话,但应保持干净以供windows管理。通常,您不希望在此处安装自己的模块。

    添加其他模块路径

    您可以将其他路径添加到 $env:psmodulepath路径 类似于如何修改 $env:PATH 用于解析可执行路径的变量。它只是一个分号 ; 模块所在目录的分隔字符串,如果模块在 $env:psmodulepath路径 ,powershell会知道在哪里找到它。实际上,您可能会看到其他已安装的工具可能已将它们自己的路径添加到 $env:psmodulepath路径 是的。一些这样做的程序/工具集示例如下 Microsoft SQL Studio 我是说, Microsoft System Center - Operations Manager ,以及 Chef Development Kit 是的。

    导入不在路径上的模块

    据我所知,您不能加载不属于 $env:psmodulepath路径 是的。但是,您可以临时编辑 $env:psmodulepath路径 包含要加载的模块的目录。例如,如果要导入名为 TestModule 从任意路径:

    $env:PSModulePath += ';C:\Path\To\Temporary\ModuleDirectory'
    Import-Module TestModule
    

    在哪里? 测试模块 作为直接子文件夹存在 C:\Path\To\Temporary\ModuleDirectory

    准备结束powershell会话时,不需要退出模块路径更改,因为上面的更改是临时的。因此,您需要修改 $env:psmodulepath路径 在每一个环节,所以如果 测试模块 如果您希望随时可用,可以将其复制到 $env:psmodulepath路径 或永久添加 C:\路径\到\临时\模块目录 PSModulePath 环境变量。

    关于unc路径的说明

    您还可以将unc(网络)路径添加到 $env:psmodulepath路径 是的。不过,我相信任何远程模块脚本仍将受制于powershell ExecutionPolicy 在系统上设置。