2014-04-16 12 views
0

我有一个脚本,带参数的默认值,如:编程方式查找Powershell的参数的默认值

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

当我询问该参数,通过在交互式会话中运行

(get-help C:\whatever\wherever\myscript.ps1 -Parameter MyParameter).defaultValue 

我得到了“无论”,就像我期望的那样。

然而,当我调用的代码相同的片段从我的应用程序,使用的代码:

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为无)。

现在,如果我更改脚本的这段,我跑像

(get-help get-process -parameter ComputerName) 

我会得到(从交互式会话)“本地计算机”,然后从上面的代码,我会得到“本地计算机“在r.BaseObject中。

我在做什么错?

+0

尝试执行只是' “(获得的帮助C:\什么\地方\ myscript.ps1)”',看看你得到任何帮助信息了。另外,请检查powerShellObject.Streams.Error集合以查看是否收到任何非终止错误。 –

回答

0

如果你打破到Visual Studio调试器,将鼠标悬停在结果变量,你会发现,你必须进一步深入得到任何有用的信息。此外,您还需要进行一些类型转换才能访问相应的成员以获取您之后的信息。

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

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