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

2023-12-02

对于使用命令行开关和 powershell 的东西,我确实处于初学者水平。我使用 PowerShell API 从 C# 调用 commandlet。我看到了奇怪的行为。在 stackoverfow 上的不同线程上,人们使用 Import-Command 或 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 和运行空间的行为到底如何。因为我需要弄清楚如何在生产计算机上安装我的命令行开关。生产机器上的单元测试如何访问我的命令行开关以完美加载。


虽然显式加载您想要使用的模块是一个很好的做法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.

导入不在路径上的模块

据我所知,您无法加载不属于的Powershell模块$env:PSModulePath。不过,您可以暂时编辑$env:PSModulePath包含包含要加载的模块的目录。例如,如果您想导入名为的模块TestModule从某个任意路径:

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

where TestModule作为子文件夹存在C:\Path\To\Temporary\ModuleDirectory

当您准备结束 Powershell 会话时,无需取消模块路径更改,因为上述更改是临时的。因此,您需要修改$env:PSModulePath在每个会话中,所以如果TestModule是您希望随时可用的东西,您可以将其复制到以下目录中的其他目录之一$env:PSModulePath或永久添加C:\Path\To\Temporary\ModuleDirectory to the PSModulePath环境变量。

关于 UNC 路径的注意事项

您还可以将 UNC(网络)路径添加到$env:PSModulePath。但是,我相信任何远程模块脚本仍将受到 Powershell 的约束ExecutionPolicy系统上设置。

关于安装模块的更多信息

默认情况下,Install-Module安装一个模块到用户模块目录,但你可以用-Scope范围。例如,以下命令将更改模块的安装位置:

# Install to the current user location (default behavior if scope unspecified)
Install-Module -Scope CurrentUser $moduleName

# Install to the all users location (requires elevated permissions)
Install-Module -Scope AllUsers $moduleName

不幸的是,这是 PowerShell 唯一可以帮助您安装模块的两个位置。系统模块对于 PowerShell 的操作至关重要,最终用户不应修改,并且将其他路径添加到$env:PSModulePath可能由 PowerShell 外部的软件管理,通常由 MSI 或其他安装程序管理。

此外,如果您编写的软件附带一个或多个 PowerShell 模块,最好让安装程序向系统的目录中添加一个新目录。%PSModulePath%并将模块放到那里,而不是安装到标准的 AllUsers 或 CurrentUser 路径,因为这些路径实际上是供最终用户随意管理的。在这种情况下,请让您的软件更新过程更新模块。这样做的好处是可以防止意外修改模块或将模块删除为不兼容的版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Powershell 如何知道在哪里可以找到要导入的模块? 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 通过PowerShell检索Azure AD应用程序的“API权限”

    出于报告和监视的目的 我想检索应用程序 应用程序注册 的 Azure 门户中显示的信息以获取 API 权限 我尝试过以下代码 app Get AzureADApplication ObjectId aa7e174d 2639 4ac7 9b
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 如何连接重叠的圆圈?

    我想在视觉上连接两个重叠的圆圈 以便 becomes 我已经有部分圆的方法 但现在我需要知道每个圆的重叠角度有多大 但我不知道该怎么做 有人有主意吗 Phi ArcTan Sqrt 4 R 2 d 2 d HTH Edit 对于两个不同的半
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐