2015-12-08 4 views
1

Описание номера:
Я создал хост для Powershell 2.0. Хост использует WPF и C#.Хост WPF для Powershell, форматирование вывода

Проблема в том, что большой вывод на мой хост WPF не отформатирован так же, как то, что отображается при использовании PowerShell ISE.

Когда я запускаю сценарий ls alias: в Powershell ISE, результаты в виде таблицы, с CommandType, Название и Определение заголовков столбцов. Когда я запускаю тот же скрипт на моем хосте WPF, результаты просто представляют собой список имен псевдонимов. Аналогичная проблема возникает со многими другими скриптами, командами и псевдонимами.

Вопрос:
Как я могу получить такую ​​же функциональность форматирования, которая, кажется, встроенный в Powershell ISE? Это проблема со стороны Powershell, или мне нужно включить дополнительный код на стороне WPF?

Пример код:
Вот класс я построил для обработки Powershell ввода и вывода, внутри WPF (рамочные любезности примера на code.msdn.microsoft.com, хотя мой класс не асинхронных):

internal class PSInterfacer 
{ 
    private Runspace runspace { get; set; } 

    public PSInterfacer() 
    { 
     runspace = RunspaceFactory.CreateRunspace(); 
     runspace.Open(); 
    } 

    public string RunScript(string script) 
    { 
     string tempOut = ""; 
     // create powershell instance 
     using (PowerShell ps = PowerShell.Create()) 
     { 
      // add existing runspace 
      ps.Runspace = runspace; 
      // add script 
      ps.AddScript(script); 
      // pipe errors to the same output as normal results 
      ps.Commands.Commands[0].MergeMyResults(PipelineResultTypes.Error, 
       PipelineResultTypes.Output); 
      // put output in list 
      List<PSObject> psOutputs = ps.Invoke().ToList(); 
      // display output elements, seperated by newlines 
      foreach (PSObject psObject in psOutputs) 
      { 
       if (psObject != null) 
       { 
        tempOut += psObject.BaseObject; 
       } 
       if (psObject != psOutputs.Last()) 
       { 
        tempOut += Environment.NewLine; 
       } 
      } 
      return tempOut; 
     } 
    } 
} 
+0

Разве это не просто конвейеру через [ 'Format-list'] (https://technet.microsoft.com/en-us/library/hh849957.aspx)? – stuartd

ответ

0

После работы в течение нескольких дней нашлось это решение. В принципе, используйте метод .AddCommand (в классе Powershell) для подключения к «Out-String». Это правильно форматирует все.

Заменить RunScript метод с этим:

public string RunScript(string script) 
{ 
    string tempOut = ""; 
    try 
    { 
     using (PowerShell ps = PowerShell.Create()) 
     { 
      ps.Runspace = runspace; 
      ps.AddScript(script); 
      ps.AddCommand("Out-String"); 
      ps.Commands.Commands[0].MergeMyResults(PipelineResultTypes.Error, PipelineResultTypes.Output); 
      List<PSObject> psOutputs = ps.Invoke().ToList(); 
      foreach (PSObject psObject in psOutputs) 
      { 
       if (psObject != null) 
       { 
        tempOut += psObject.BaseObject; 
       } 
      } 
     } 
    } 
    catch(Exception ex) 
    { 
     tempOut = string.Format("Error when invoking powershell commands:\n{0}", ex.Message); 
     tempOut += "\nThis function did not complete."; 
    } 
    return tempOut; 
} 
Смежные вопросы