C# 运行空间PowerShell输出

C# 运行空间PowerShell输出,c#,powershell,C#,Powershell,我有一个powershell脚本文件,它执行一些操作并输出结果。如果我使用cmd在远程主机上手动运行它,我将得到清晰的输出 但当我试图使用c#通过PowerShell运行空间执行脚本时,我无法看到脚本的输出。只有命令自己 using (PowerShell powershell = PowerShell.Create()) { try { PowerShell ps = PowerShell.Create(); ps.AddScript("c:\temp\myps.ps1

我有一个powershell脚本文件,它执行一些操作并输出结果。如果我使用cmd在远程主机上手动运行它,我将得到清晰的输出

但当我试图使用c#通过PowerShell运行空间执行脚本时,我无法看到脚本的输出。只有命令自己

using (PowerShell powershell = PowerShell.Create())
{
  try
  {
    PowerShell ps = PowerShell.Create();
    ps.AddScript("c:\temp\myps.ps1");
    ICollection<PSObject> results = ps.Invoke();
    using (StringWriter sw = new StringWriter())
    {
      foreach (PSObject invoke in results)
        sw.WriteLine(invoke.ToString());

      outp = sw.ToString();
    }

    //Script errors
    if (ps.Streams.Error.Count > 0)
    {
      outp += Environment.NewLine + string.Format("{0} errors: ", ps.Streams.Error.Count);
      foreach (ErrorRecord err in ps.Streams.Error)
        outp += Environment.NewLine + err.ToString();
    }
  }
  catch (Exception e)
  {
    // Terminating errors
    outp = "Critical error: " + e.Message;
  }
}

remoteRunspace.Close();

//In the end outp for me = "c:\temp\myps.ps1"
使用(PowerShell PowerShell=PowerShell.Create())
{
尝试
{
PowerShell ps=PowerShell.Create();
ps.AddScript(“c:\temp\myps.ps1”);
ICollection results=ps.Invoke();
使用(StringWriter sw=new StringWriter())
{
foreach(结果中的PSObject调用)
sw.WriteLine(invoke.ToString());
outp=sw.ToString();
}
//脚本错误
如果(ps.Streams.Error.Count>0)
{
outp+=Environment.NewLine+string.Format(“{0}错误:”,ps.Streams.Error.Count);
foreach(在ps.Streams.Error中记录错误)
outp+=Environment.NewLine+err.ToString();
}
}
捕获(例外e)
{
//终止错误
outp=“严重错误:”+e.消息;
}
}
remoteRunspace.Close();
//在结束时为我输出=“c:\temp\myps.ps1”

如何从C#访问输出?

请参阅有关PowerShell类的文档:

看起来您需要访问PSObject的成员才能获得输出。否则,它只会将laim ToString()数据发送到StringBuilder对象。你有什么可以展示的例子吗?我可能会提供一个更好的答案与样本。另外,远程运行空间在哪里


谢谢

下一个对我有用的代码:

try
  {
    PowerShell ps = PowerShell.Create().AddScript("c:\temp\myps.ps1", true);
    ps.Runspace = remoteRunspace;
    ICollection<PSObject> results = ps.Invoke();
    using (StringWriter sw = new StringWriter())
    {
      foreach (PSObject invoke in results)
        sw.WriteLine(invoke.ToString());

      outp = sw.ToString();
    }

    //Script errors
    if (ps.Streams.Error.Count > 0)
    {
      outp += Environment.NewLine + string.Format("{0} errors: ", ps.Streams.Error.Count);
      foreach (ErrorRecord err in ps.Streams.Error)
        outp += Environment.NewLine + err.ToString();
    }
  }
  catch (Exception e)
  {
    // Terminating errors
    outp = "Critical error: " + e.Message;
  }
}

remoteRunspace.Close();
试试看
{
PowerShell ps=PowerShell.Create().AddScript(“c:\temp\myps.ps1”,true);
ps.运行空间=远程运行空间;
ICollection results=ps.Invoke();
使用(StringWriter sw=new StringWriter())
{
foreach(结果中的PSObject调用)
sw.WriteLine(invoke.ToString());
outp=sw.ToString();
}
//脚本错误
如果(ps.Streams.Error.Count>0)
{
outp+=Environment.NewLine+string.Format(“{0}错误:”,ps.Streams.Error.Count);
foreach(在ps.Streams.Error中记录错误)
outp+=Environment.NewLine+err.ToString();
}
}
捕获(例外e)
{
//终止错误
outp=“严重错误:”+e.消息;
}
}
remoteRunspace.Close();

您好,远程运行空间这是指定网络中的另一台计算机。我想得到完整的输入。即,与我在cmd.Gotcha中手动启动PS命令时看到的相同。尝试一下本文-它已经有了一个代码示例: