Как получить доступ к набору переменных Powershell в командлетах C#

Я хотел бы получить доступ ко всем PSVariables, установленным в командлете на С#. Итак, мой один командлет C# будет устанавливать переменные из сценария powershell в sessionState, а другой командлет будет перечислять все переменные 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 

и позже в определенный момент в сценарии я хотел бы получить доступ именно к вышеуказанным переменным вместе с их типами.

i.e.

$availableVariables = Enumerate-AllAvailableVariables

и вывод вышеуказанного командлета должен быть

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

Как это возможно?


person Usman    schedule 15.06.2018    source источник
comment
Зачем вам заполнять переменные значениями, если ваш вывод показывает только имена свойств и их тип?   -  person Kirill Pashkov    schedule 15.06.2018
comment
Поскольку вывод вышеуказанного PSComndlet состоит только в перечислении доступных переменных. В основном для моего делового варианта использования требуется, чтобы пользователь мог видеть доступные переменные в powershell в любой момент.   -  person Usman    schedule 15.06.2018
comment
Мой единственный бизнес-кейс - заполнить переменные powershell, прочитав внешний файл с диска. (Это может содержать 1000 переменных со значениями), и пользователь может быть заинтересован в получении значений только нескольких из них. Таким образом, один командлет может перечислять только имена и типы загруженных переменных.   -  person Usman    schedule 15.06.2018
comment
Я думаю, вы хотите использовать автоматическую переменную $PSBoundParameters   -  person Kirill Pashkov    schedule 15.06.2018
comment
К сожалению нет. $PSBoundParameters просто содержит словарь параметров, которые передаются сценарию или функции, и их текущие значения. Где же я четко написал чего хочу.   -  person Usman    schedule 15.06.2018


Ответы (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. Вот функция, которую я сделал на основе ее вывода.

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    Имя задано              (Все)       
person Kirill Pashkov    schedule 15.06.2018