2013-10-30 100 views
5

我必須通過C#來設置PowerShell的一個變量,必須通過C#再次使用該變量在PowerShell中,到目前爲止我的代碼:通過C#PowerShell的設置變量

var command = string.Format("$item = Invoke-RestMethod {0} ", "http://services.odata.org/OData/OData.svc/?`$format=json"); 
var command2 = string.Format("$item.value[0].name"); 
InvokeCommand.InvokeScript(command); 
object namesOne= InvokeCommand.InvokeScript(command2); 

在這種情況下,輸出應爲: 產品

但這C#不工作,我也累了:

Runspace runSpace = RunspaceFactory.CreateRunspace(); 
runSpace.Open(); 
Pipeline pipeline = runSpace.CreatePipeline(); 

Command invoke = new Command("Invoke-RestMethod"); 
invoke.Parameters.Add("Uri", "http://services.odata.org/OData/OData.svc/?`$format=json"); 
pipeline.Commands.Add(invoke); 

runSpace.SessionStateProxy.SetVariable("item", pipeline.Invoke()); 
var a = runSpace.SessionStateProxy.PSVariable.GetValue("item"); 
Command variable = new Command("Write-Host $item"); 

pipeline.Commands.Add(variable); 
var output = pipeline.Invoke(); 

但它的作品都不是。 有人知道我如何在Powershell中設置變量,並且可以通過C#在Powershell中使用它?

回答

4

在關於設置一個變量,如預期你的第二個代碼塊的工作,下面是一個快速測試在PowerShell中設置$項目FooBar的,拉這回確認值是正確的:

[Test] 
public void PowershellVariableSetTest() 
{ 
    var runSpace = RunspaceFactory.CreateRunspace(); 
    runSpace.Open(); 

    runSpace.SessionStateProxy.SetVariable("item", "FooBar"); 
    var a = runSpace.SessionStateProxy.PSVariable.GetValue("item"); 

    Assert.IsTrue(a.ToString() == "FooBar"); 
} 

直接在PowerShell與C#的工作,下面應該做的伎倆:

var command = string.Format("$item = Invoke-RestMethod {0} ", "http://services.odata.org/OData/OData.svc/?`$format=json"); 
var command2 = string.Format("$item.value[0].name"); 

var powershell = PowerShell.Create(); 
powershell.Commands.AddScript(command); 
powershell.Commands.AddScript(command2); 
var name = powershell.Invoke()[0]; 
+0

謝謝你的答案。但我不想在C#中獲得這個變量。我想在PowerShell中設置它,然後通過C#在PowerShell中使用它。 –

+0

我已更新我的回答 – JMK

+0

它的工作,謝謝你的更新回答:) –

3

另一種方式來做到這一點。

設置變量:

SessionState.PSVariable.Set("TestVar", "1"); 

獲取變量:

object myvar = GetVariableValue("TestVar");