Usm*_*man 4 c# powershell cmdlets runspace
我真的处于使用命令行开关和 powershell 东西的初学者级别。我正在使用 PowerShell API 从 C# 调用命令行开关。我看到了奇怪的行为。虽然在 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);
Run Code Online (Sandbox Code Playgroud)
上面的命令会自动从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。
据我所知,您无法加载不属于$env:PSModulePath. 但是,您可以临时编辑$env:PSModulePath以包含要加载的模块的目录。例如,如果您想导入TestModule从某个任意路径命名的模块:
$env:PSModulePath += ';C:\Path\To\Temporary\ModuleDirectory'
Import-Module TestModule
Run Code Online (Sandbox Code Playgroud)
其中TestModule作为子文件夹存在C:\Path\To\Temporary\ModuleDirectory
当您准备好结束 Powershell 会话时,您不需要取消模块路径更改,因为上述更改是暂时的。因此,您需要$env:PSModulePath在每个会话中进行修改,因此如果TestModule您希望始终使用某些内容,您可以将其复制到其他目录之一$env:PSModulePath或永久添加C:\Path\To\Temporary\ModuleDirectory到PSModulePath环境变量中。
您还可以将 UNC(网络)路径添加到$env:PSModulePath. 但是,我相信任何远程模块脚本仍将受制于ExecutionPolicy系统上设置的 Powershell 。
默认情况下,Install-Module将模块安装到User Modules目录,但您可以使用-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
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是 PowerShell 将帮助您安装模块的仅有的两个位置。系统模块对于 PowerShell 的操作至关重要,不应由最终用户修改,添加的其他路径$env:PSModulePath可能由 PowerShell 之外的软件管理,通常由 MSI 或其他安装程序管理。
此外,如果您编写的软件附带一个或多个 PowerShell 模块,最好让安装程序向系统添加一个新目录%PSModulePath%并将模块放在那里,而不是安装到标准的 AllUsers 或 CurrentUser 路径,因为这些是真正的意思供最终用户随心所欲地管理。在这种情况下,让您的软件更新过程更新模块。这有利于防止意外修改或将模块移除到不兼容的版本。
| 归档时间: |
|
| 查看次数: |
4345 次 |
| 最近记录: |