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

问题描述:

这里是我正在尝试使用的测试脚本,我从一个单独的进程调用它并尝试将参数传递给它。这个想法是,我有一个用户界面,允许用户选择一个CmdLet,然后用该CmdLet的属性/方法填充另一个下拉列表。是否可以使用cmdlet作为动态PowerShell脚本的输入参数?

我的问题似乎是,脚本将输入参数呈现为一个字符串,并且因此正在创建一个文本文件,其中包含您应用“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; 

编辑更多信息:

输出我希望的,在获取-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

你描述的是'显示,Command' cmdlet的做什么。它显示一个cmdlet的用户界面。是否有理由重写内置cmdlet?或者'Get-Command'可用于检索代表基于名称的给定cmdlet,函数或脚本的对象。 –

+0

嗨@mikez,谢谢你的回应。我试图实现的目的是为不熟悉PowerShell或脚本的用户提供易用性。这个想法是将这个功能包装到现有的多用途UI中,但是提供可扩展性和可重用的代码。我应该如何在我的情况下使用Get-Command?我试过这个: param([string] $ inputCmdLet =“Get-NetAdapter”); $ targetCmdLet = Get-Command $ inputCmdLet; 但是,唉,这没有得到我输入的cmdlet的成员属性和方法。谢谢! – africo

为了执行其(只)被存储在一个变量或名字以单或双引号中指定的命令,你必须使用&,该电话运营商

# 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没有参数可能会产生很多人,这是不必要的,因此可以考虑像& $inputCmdlet | Select-Object -First 1

  • 一般地,你可以使用像(Get-Command Get-NetAdapter).OutputType获得cmdlet的输出类型,但要注意的是:

    • 声明的输出类型是可选,所以不是所有的cmdlet可能会返回一个值。

    • 如果你开始与比该类型的实例一个评价人,你不能使用Get-Member来发现实例成员(你只能通过-Static获得静态成员)。

+1

&符号做了诡计。这仍然是一个想法正在形成,所以我期待遇到像你所描述的警告。我仍然对PowerShell不熟悉,并且缺乏像这样的一些基础知识;我认为这可能是一件简单的事情,但我并不了解。非常感激! – africo