是否可以使用cmdlet作为动态PowerShell脚本的输入参数?

时间:2017-12-03 02:57:00

标签: powershell

这是我正在尝试使用的测试脚本,我从一个单独的进程调用它并尝试将参数传递给它。我的想法是,我有一个用户界面,允许用户选择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在没有引号的情况下渲染出来?

如果我对此没有任何意义,请告诉我,无论是我的描述,还是这个想法。

谢谢!

1 个答案:

答案 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获取静态成员)。