以编程方式查找Powershell参数默认值

时间:2014-04-16 16:52:01

标签: .net vb.net powershell reflection

我有一个脚本,带有参数和默认值,例如:

<#
  Help Info snipped...
#> 
param(
  [string]$MyParameter = "Whatever" ,
)

当我通过在交互式会话中运行

来查询该参数时
(get-help C:\whatever\wherever\myscript.ps1 -Parameter MyParameter).defaultValue

我得到&#34;无论如何&#34;,就像我期望的那样。

但是,当我从我的应用程序调用相同的代码片段时,使用代码:

    Dim inputString As String = "(get-help C:\whatever\wherever\myscript.ps1  -Parameter MyParameter).defaultValue"


    Using powerShellObject As PowerShell = PowerShell.Create()
        Dim powershellCommand As PSCommand = powerShellObject.Commands.AddScript(inputString)


        For Each r As PSObject In powerShellObject.Invoke
            Debug.Print(r.BaseObject)
        next
..blah blah blah

我什么都没回来(即变量r什么都没有)。

现在,如果我将运行的脚本snippit更改为

(get-help get-process -parameter ComputerName)

我将(通过交互式会话)和#34;本地计算机&#34;以及上面的代码,我将获得&#34;本地计算机&#34;在r.BaseObject。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

如果您进入Visual Studio调试器并将鼠标悬停在结果变量上,您将发现必须进一步向下钻取以获取任何有用的信息。此外,您还必须进行一些类型转换才能访问相应的成员以获取您所需的信息。

例如,在这里我将“description”字符串数组聚合在一起,以获取-ComputerName命令的Invoke-Command参数的“描述”。

static void Main(string[] args)
{
    PowerShell ps = PowerShell.Create();
    ps.AddCommand("Get-Help");
    ps.AddParameter("Name", "Invoke-Command");
    ps.AddParameter("Parameter", "ComputerName");
    var result = ps.Invoke();
    var result2 = ((PSObject[])result[0].Members["description"].Value).Select(psobj => psobj.Members["Text"].Value).Aggregate((text, mystr) => text + ", " + mystr);
    Console.WriteLine(result2);
    //Debug.WriteLine(String.Join(' ', result[0].Members["description"].Value));
    Console.ReadLine();
}

Results Visual Studio Debugger