当我的控制器功能遇到运行时错误时,我正在尝试打印错误文本。我的函数中有一行要添加
items.Add(shell.Streams.Error.ToString());
但是要添加的文本打印类型
'{System.Management.Automation.PSDataCollection<System.Management.Automation.ErrorRecord>}'
放置断点并解析结果视图时出现的错误是
{无法找到具有以下身份的对象:'3180af9e-3c0e-41ff-94fe-3af'}
我尝试将错误类型转换为字符串。
public List<string> PowerShellExecutorGrd(string scriptPath, string arg)
{
var items = new List<string>();
using (var shell = PowerShell.Create())
{
shell.Commands.AddCommand(scriptPath).AddArgument(arg);
var results = shell.Invoke();
System.Diagnostics.Debug.WriteLine(shell.HadErrors.ToString());
if (shell.HadErrors == false) {
if (results.Any()) {
foreach (var psObj in results){
items.Add(Server.HtmlEncode(psObj.ToString().Trim('{','}')));
}
}
else
{
items.Add(shell.Streams.Error.ToString());
}
};
return items;
}
}
错误消息应该是
“找不到具有以下身份的对象:'3180af9e-3c0e-41ff-94fe-3af'”,而不是System.Management.Automation.PSDataCollection
答案 0 :(得分:1)
shell.Streams.Error
对象的类型为PSDataCollection<ErrorRecord>
。由于PSDataCollection<T>
类不会覆盖ToString()
方法,因此,当您调用.ToString()
时,它实际上是在调用Object.ToString()
,这只会打印出类型的名称。这就是为什么您看到自己看到的东西。
重点是shell.Streams.Error
并未真正描述该错误。这是错误的集合。因此,您需要遍历集合并在集合内的ToString()
对象上调用ErrorRecord
。
集合中可能只有一个ErrorRecord
,但是如果有更多的话,可以将它们连接在一起:
var errorMessage = new StringBuilder();
foreach (ErrorRecord err in shell.Streams.Error) {
errorMessage.AppendLine(err.ToString());
}
items.Add(errorMessage.ToString());
ErrorRecord
类确实覆盖了ToString()
方法,因此应该可以向您发送期望的消息。