我想访问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[]
怎么可能?
答案 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 Имя задано (Все)