【发布时间】:2017-12-04 01:29:50
【问题描述】:
这是我正在尝试使用的测试脚本,我从一个单独的进程中调用它并尝试将参数传递给它。这个想法是我有一个用户界面,允许用户选择一个 CmdLet,然后使用该 CmdLet 的属性/方法填充另一个下拉列表。
我的问题似乎是脚本将输入参数呈现为字符串,因此正在创建一个文本文件,其中包含您已应用“Get-Member”的任意字符串的方法和属性,例如“克隆”或“比较对象”。唯一的属性是“Length”。
有什么方法可以将该输入参数作为可用的 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 不带引号呈现?
如果我的描述或这个想法没有任何意义,请告诉我。
谢谢!
【问题讨论】:
-
您所描述的是
Show-Commandcmdlet 的作用。它显示 cmdlet 的 UI。是否有理由重写内置 cmdlet?或者,Get-Command可用于检索表示基于名称的给定 cmdlet、函数或脚本的对象。 -
嗨@mikez,感谢您的回复。我试图实现的目的是为完全不熟悉 powershell 或脚本的用户提供易用性。这个想法是将此功能包装到现有的多用途 UI 中,但提供可扩展性和可重用代码。在我的情况下,我应该如何使用 Get-Command?我试过这个: param([string]$inputCmdLet = "Get-NetAdapter"); $targetCmdLet = 获取命令 $inputCmdLet;但是,这并没有让我获得输入的 cmdlet 的成员属性和方法。谢谢!
标签: powershell