2014-04-16 43 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