c# - 如何在运行时从模块代码中获取 PowerShell 模块版本

Posted

技术标签:

【中文标题】c# - 如何在运行时从模块代码中获取 PowerShell 模块版本【英文标题】:c# - How to get the PowerShell module version from inside the module code at runtime 【发布时间】:2021-03-27 05:30:55 【问题描述】:

我有一个用于实现 PowerShell 命令的 C# PSCmdlet 类,我想在运行命令时获取我的模块版本。

我不想从程序集位置获取版本,因为我需要加载实际版本(它可能会有所不同,例如,如果我在升级我的模块时保持 PowerShell 打开,则程序集将指向升级后的版本而且我不会得到已经加载的那个)。

对于当前会话,我需要 Get-Module 之类的东西,但来自我的 C# 命令代码。

我该怎么做?

【问题讨论】:

在您的每个会话中,加载所有默认/需要的模块和其他内容,然后在您的会话中将其与您在该会话中加载的内容进行比较。 【参考方案1】:

由于我在差不多一年后一直在同一个十字军东征中,所以我想出了:

$version = Split-Path -Leaf $MyInvocation.MyCommand.ScriptBlock.Module.ModuleBase

【讨论】:

【参考方案2】:

根据我的评论详细说明。所以,在 PowerShell 中,可能是这样的......

# Put this in your profile (ISE/PowerShell/VSCode)
$AutomaticModules     = Get-Module

$AutomaticModules
# Results
<#
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Binary     1.0.0.0    CimCmdlets                          Export-BinaryMiLog, ...
Script     1.1.0      ClassExplorer                       Find-Member, Find-Na...
...
#>

# Get only modules loaded during the session
Compare-Object -ReferenceObject (Get-Module) -DifferenceObject $AutomaticModules -Property Name -PassThru |
Where -Property Name -ne 'AutomaticModules'

# Results
<#
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Manifest   3.0.0.0    Microsoft.PowerShell.Security       ConvertFrom-SecureString, ...
Manifest   3.0.0.0    Microsoft.WSMan.Management          Connect-WSMan, Disable-WSMa...
#>

Import-Module -Name IsePester

Compare-Object -ReferenceObject (Get-Module) -DifferenceObject $AutomaticModules -Property Name -PassThru |
Where -Property Name -ne 'AutomaticModules'

# Results
<#
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     0.0        IsePester                           Add-PesterMenu, Get-PesterM...
Manifest   3.0.0.0    Microsoft.PowerShell.Security       ConvertFrom-SecureString, C...
Manifest   3.0.0.0    Microsoft.WSMan.Management          Connect-WSMan, Disable-WSMa...
#>

所以,作为一个函数:

function Get-SessionModule

    Param
    (
        [String]$ModuleName
    )

    (Compare-Object -ReferenceObject (Get-Module) -DifferenceObject $AutomaticVModules -Property Name -PassThru |
    Where -Property Name -ne 'AutomaticVModules') -Match $ModuleName


Get-SessionModule -ModuleName IsePester
# Results
<#
ModuleType Version    Name                                ExportedCommands
---------- -------    ----                                ----------------
Script     0.0        IsePester                           Add-PesterMenu, Ge... 
#>

【讨论】:

以上是关于c# - 如何在运行时从模块代码中获取 PowerShell 模块版本的主要内容,如果未能解决你的问题,请参考以下文章

Power Query - 当文件具有不同页面时从 PDF 中获取数据

从其代码中获取 unicode 字符串 - C#

C# - 在需要时从多个运行的计时器中处理一个特定的计时器[关闭]

如何在 c# 中关闭任何浏览器时从 XMPP 注销?

如何在运行时从 InfoPlist.string 获取值?

如何在运行时从 DynamoDB 获取排序结果