【问题标题】:How to access Powershell variable set within C# commandlets如何访问 C# 命令行开关中设置的 Powershell 变量
【发布时间】:2018-11-25 04:45:19
【问题描述】:

我想访问在 C# 中的命令行开关中设置的所有 PSVariable。 因此,我的一个 C# Commandlet 将在 sessionState 中设置来自 powershell 脚本的变量,而另一个 commandlet 将枚举所有 sessionState 变量及其在 commandlet 中设置的类型。我不想枚举脚本变量。

例如

[string[]]$ListOfEmployees = "EmployeeA","EmployeeA","EmployeeC"
Set-Parameters "Employees" $ListOfEmployees

[string[]]$ListOfDepartments = "Communication","Mathematics","ComputerScience"
Set-Parameters "Departments" $ListOfDepartments 

[string[]]$ListOfCoursesInAllDepts = "CourseA","CourseB","CourseC"
Set-Parameters "Courses" $ListOfCoursesInAllDepts 

稍后在脚本中的某个位置,我想准确访问上面的变量及其类型。

$availableVariables = Enumerate-AllAvailableVariables

上面Commandlet的输出应该是

Name             Type
-------------    ------
Employees        String[]
Departments      String[]
Courses          String[]

这怎么可能?

【问题讨论】:

  • 如果您的输出仅显示属性名称及其类型,为什么还要用值填充变量?
  • 因为上面 PSComndlet 的输出只是枚举可用变量。基本上对于我的业务用例来说,需要方便用户随时查看powershell中的可用变量。
  • 我的一个商业案例是通过从磁盘读取外部文件来填充 powershell 变量。 (这可能包含 1000 个带值的变量)并且用户可能对获取其中几个变量的值感兴趣。因此,一个命令行开关只能枚举已加载变量的名称和类型
  • 我想你想使用自动变量 $PSBoundParameters
  • 不幸的是,不是。 $PSBoundParameters 仅包含传递给脚本或函数的参数及其当前值的字典。正如我清楚地写下我想要的那样。

标签: c# powershell cmdlets runspace


【解决方案1】:

我认为您正在寻找自动变量$PSBoundParameters,它捕获输入参数及其值等。

虽然我仍然不能 100% 确定您到底在寻找什么,但我会尝试向您提出一些建议。

这是我刚刚制作的代码示例:

通过这篇文章,我希望您能明白 $PSBoundParameters 的工作原理。

function Do-This
{
    param(
        [String[]]$Employees,
        [String[]]$Departments,
        [String[]]$Courses
    )
    $Keys = $PSBoundParameters.Keys
    foreach ($Key in $Keys)
    {
        New-Object PSObject -Property @{
            Name=$Key
            Type=$PSBoundParameters[$Key].GetType()
        }
    }
}
Do-This -Employees @('EmployeeA','EmployeeA','EmployeeC') -Departments @('Communication','Mathematics','ComputerScience') -Courses @('CourseA','CourseB','CourseC')

还有一个很好的方法来获取函数信息,例如参数名称及其类型 - Get-Help cmdlet。这是我根据它的输出制作的一个函数。

function Get-FunctionParams
{
param([Parameter(Mandatory=$true,ValueFromPipelineByPropertyName=$true,Position=0)][string]$FunctionName)
    $Results = @()
    $Parameters = @((Get-Help $FunctionName).parameters.parameter)
    if ($Parameters.Count -eq 0)
    {
        Write-Host $('Function {0} has no parameters' -f $FunctionName)
        break
    }
    foreach ($Parameter in $Parameters){
        $Object = New-Object -TypeName PSObject
        $Object | Add-Member -MemberType NoteProperty -Name Name -Value $Parameter.name
        $Object | Add-Member -MemberType NoteProperty -Name aliases -Value $Parameter.aliases
        $Object | Add-Member -MemberType NoteProperty -Name required -Value $Parameter.required
        $Object | Add-Member -MemberType NoteProperty -Name type -Value $Parameter.type.name
        $Object | Add-Member -MemberType NoteProperty -Name position -Value $Parameter.position
        $Object | Add-Member -MemberType NoteProperty -Name defaultValue -Value $Parameter.defaultValue
        $Object | Add-Member -MemberType NoteProperty -Name parameterSetName -Value $Parameter.parameterSetName
        $Results += $Object
    }
    Write-Output $Results | Sort-Object position,Name | Format-Table -AutoSize -Wrap
}

使用示例Get-FunctionParams -FunctionName Get-Process 使用示例的输出:

Name            aliases     required type      position   defaultValue parameterSetName
----            -------     -------- ----      --------   ------------ ----------------
Name            ProcessName false    string[]  0                       Name            
ComputerName    Cn          false    string[]  Имя задано              (Все)           
FileVersionInfo FV, FVI     false    switch    Имя задано              (Все)           
Id              PID         true     int[]     Имя задано              Id              
InputObject     Отсутствует true     Process[] Имя задано              InputObject     
Module          Отсутствует false    switch    Имя задано              (Все)       

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-24
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    相关资源
    最近更新 更多