• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

powershell 来源:africo 3次浏览

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

请让我知道,如果我没有理解这个,无论是我的描述,还是完全的想法。

谢谢!


===========解决方案如下:

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

# 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获得静态成员)。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)