Как прочитать вывод Write-Host из скрипта Powershell в C# - PullRequest
0 голосов
/ 30 января 2020

При запуске скрипта в Powershell я могу получить вывод Write-Host, но не в C#.
Вот код для вывода Write-Host "HELLO WORLD TEST."
сбой приложения при достижении этой строки:
Collection<PSObject> results = pipeline.Invoke();
Я получаю это сообщение об ошибке:

HostException: команда, которая запрашивает пользователя, произошла ошибка из-за программы хоста или типа команды не поддерживает взаимодействие с пользователем. Попробуйте хост-программу, которая поддерживает взаимодействие с пользователем, такую ​​как Windows PowerShell Console или Windows PowerShell ISE, и удалите связанные с приглашением команды из типов команд, которые не поддерживают взаимодействие с пользователем, таких как Windows Рабочие процессы PowerShell

Как я могу вернуть вывод Write-Host? Заранее спасибо.

protected void Page_Load(object sender, EventArgs e) {

    if (!IsPostBack) {
        RunScript(@"C:\TestScript.ps1");
    }
}

private string RunScript(string scriptText) {

    Runspace runspace = RunspaceFactory.CreateRunspace();

    runspace.Open();

    Pipeline pipeline = runspace.CreatePipeline();
    pipeline.Commands.AddScript(scriptText);

    pipeline.Commands.Add("Out-String");

    Collection < PSObject > results = pipeline.Invoke();

    runspace.Close();

    StringBuilder stringBuilder = new StringBuilder();
    foreach(PSObject obj in results) {
        //do something
    }
    return Textbox.Text;
}

1 Ответ

2 голосов
/ 30 января 2020

Вы можете работать с PowerShell следующим образом. Создайте экземпляр и добавьте прослушиватели для всех интересующих вас потоков Powershell:

private string RunScript(string scriptText)
{


    System.Management.Automation.PowerShell powerShellInstance = System.Management.Automation.PowerShell.Create();

powerShellInstance.Streams.Information.DataAdded += InformationHandler;

    powerShellInstance.Streams.Verbose.DataAdded += InformationalRecordEventHandler<VerboseRecord>;

    powerShellInstance.Streams.Debug.DataAdded += InformationalRecordEventHandler<DebugRecord>;

    powerShellInstance.Streams.Warning.DataAdded += InformationalRecordEventHandler<WarningRecord>;

    powerShellInstance.AddScript(scriptText);
                        powerShellInstance.Invoke();               
}

 static void InformationalRecordEventHandler<T>(object sender, DataAddedEventArgs e) 
        where T : InformationalRecord
    {
        var newRecord = ((PSDataCollection<T>)sender)[e.Index];
        if (!string.IsNullOrEmpty(newRecord.Message))
        {
            //STORE your message somewhere
        }
    }

static void InformationHandler(object sender, DataAddedEventArgs e)
    {
        var newRecord = ((PSDataCollection<InformationRecord>)sender)[e.Index];
        if (newRecord?.MessageData != null)
        {
            //STORE your message somewhere
        }
    }
...