这是我正在尝试使用的测试脚本,我从一个单独的进程调用它并尝试将参数传递给它。我的想法是,我有一个用户界面,允许用户选择CmdLet,然后使用该CmdLet的属性/方法填充另一个下拉列表。
我的问题似乎是脚本将输入参数呈现为字符串,因此正在创建一个文本文件,其中包含您已应用“Get-Member”的任意字符串的方法和属性,例如“克隆”或“CompareTo”。唯一的属性是“长度”。
有没有办法让输入参数作为可用的CmdLet而不是字符串?也许我错过了一些东西,或者也许我正在尝试做的事情是不可能的。
param([string]$inputCmdLet = "Get-NetAdapter");
$wrkgDir = "D:\Distribution\Operational";
# Get Properties and Methods for CmdLet Input Parameter
$propertyNames = $inputCmdLet | Get-Member -MemberType Property;
$methodNames = $inputCmdLet | Get-Member -MemberType Method;
# Sort Arrays
$propertyNames = $propertyNames | Sort-Object Name;
$methodNames = $methodNames | Sort-Object Name;
# Output Results to Text Files
$propertyNames.Name | Out-File $wrkgDir\$inputCmdLet.Properties.txt;
$methodNames.Name | Out-File $wrkgDir\$inputCmdLet.Methods.txt;
编辑更多信息:
我希望的输出,在Get-NetAdapter的示例中,是一个输出文件中的属性列表和另一个输出文件中的方法。我现在得到的是:
Left list is expected (partial) result, right list is actual result.
我不确定如何以编程方式在左侧(在图像中)实现结果列表。我可以通过静态输入来获得正确的输出:
$mbrNameStatic = Get-NetAdapter | Get-Member;
$mbrNameStatic.Name | Out-File $wrkgDir\$inputCmdLet.Strings.txt;
但是当我使用输入参数时,它将值合并为一个字符串,所以看起来实际的运行时代码看起来更像是这样:
$propertyNames = "Get-NetAdapter" | Get-Member -MemberType Property;
因此添加引号会将cmdlet呈现为字符串(我认为是有道理的,因为我的输入参数是一个字符串),它返回字符串的属性和方法而不是cmdlet。有没有办法让cmdlet在没有引号的情况下渲染出来?
如果我对此没有任何意义,请告诉我,无论是我的描述,还是这个想法。
谢谢!
答案 0 :(得分:0)
要执行 name (仅)存储在变量中或其名称以单引号或双引号指定的命令,必须使用&
,呼叫运营商。
# WRONG: The token is interpreted as an *expression* that outputs a *string*
"Get-NetAdapter" # outputs the [string] literal
# WRONG: ditto, via a variable
$name = "Get-NetAdapter"
$name # outputs the contents of the [string] variable
# OK: Use of & tells Powershell to interpret the next token as a *command* to *invoke*.
& "Get-NetAdapter"
& $name
至于你的一般方法:
请注意,调用不带参数时,并非所有cmdlet都会生成输出,因此您当前的代码(即使使用&
)也不适用于所有cmdlet。
相反,那些在没有参数的情况下确实产生输出的cmdlet可能会产生 lot ,这是不必要的,所以请考虑& $inputCmdlet | Select-Object -First 1
。
通常,您可以使用类似(Get-Command Get-NetAdapter).OutputType
的内容来获取cmdlet的输出类型,但请注意:
声明输出类型是可选,因此并非所有cmdlet都可以返回值。
如果您使用类型 rater而不是该类型的实例,则无法使用Get-Member
来发现实例成员(您只能通过-Static
获取静态成员)。