通过C#Powershell变量设置

时间:2013-10-30 09:16:48

标签: c# variables powershell

我必须通过C#在PowerShell中设置一个变量,并且必须再次通过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");
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中使用它吗?

2 个答案:

答案 0 :(得分:4)

关于设置变量,您的第二个代码块按预期工作,以下是PowerShell中 $ item 的快速测试设置 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");
}

要从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");

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

答案 1 :(得分:3)

另一种方法。

设置变量:

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

获取变量:

object myvar = GetVariableValue("TestVar");