【问题标题】:Runspace PowerShell output运行空间 PowerShell 输出
【发布时间】:2015-11-17 17:27:51
【问题描述】:

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

但是当我尝试使用 c# 通过 PowerShell Runspace 执行脚本时,我无法看到脚本的输出。仅命令自身。

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"

如何访问 C# 的输出?

【问题讨论】:

    标签: c# powershell


    【解决方案1】:

    请参阅有关 PowerShell 类的文档:https://msdn.microsoft.com/en-us/library/system.management.automation.powershell(v=vs.85).aspx

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

    谢谢!

    【讨论】:

    • 嗨,远程运行空间它是指定网络中的另一台计算机。我想回来 - 完整的输入。 IE。和我在 cmd 中手动启动 PS 命令时看到的一样。
    • 明白了。试试这篇文章 - 它已经有一个代码示例:technet.microsoft.com/en-us/library/ee706592(v=vs.85).aspx
    【解决方案2】:

    下一个代码适合我:

    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();
    

    【讨论】:

      猜你喜欢
      • 2018-07-08
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-29
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      相关资源
      最近更新 更多