我有一个powershell脚本文件,它做一些事情并输出结果。如果我在远程主机上使用cmd手动运行它,我将得到清晰的输出。
但是当我试图使用c#通过PowerShell Runspace执行脚本时,我无法看到脚本的输出。只有命令本身。
using (PowerShell powershell = PowerShell.Create())
{
try
{
PowerShell ps = PowerShell.Create();
ps.AddScript("c:tempmyps.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:tempmyps.ps1"
如何访问c#的输出?
查看有关PowerShell类的文档:https://msdn.microsoft.com/en-us/library/system.management.automation.powershell(v=vs.85).aspx
看起来需要访问PSObject的成员才能获得输出。否则,它只会将断言ToString()数据发送给StringBuilder对象。你有什么可以展示的例子吗?我也许能提供一个更好的答案与样品。另外,远程运行空间位于哪里?
谢谢!
下一个为我工作的代码:
try
{
PowerShell ps = PowerShell.Create().AddScript("c:tempmyps.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();