Как получить текст ошибки из представления результатов свойства ошибки в текст? - PullRequest
0 голосов
/ 10 июля 2019

Я пытаюсь напечатать текст ошибки, когда в моей функции контроллера обнаружена ошибка во время выполнения.В моей функции есть строка, куда я добавляю

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

1 Ответ

1 голос
/ 10 июля 2019

Объект 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 class делает переопределить метод ToString(), так что вы должны получитьожидаемое сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...