如何在C#命令行开关中访问Powershell变量集

时间:2018-06-15 10:37:07

标签: c# powershell cmdlets runspace

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

e.g。

[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[]

怎么可能?

1 个答案:

答案 0 :(得分: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    Имя задано              (Все)