TLDW: для поддержки определенного c процесса мне нужно go из экземпляров / модуля powershell, чтобы запустить известный безопасный исполняемый файл для некоторого c# magi c, который затем, в свою очередь, должен ударить и выполнить сценарий powershell перед выходом.
Точка входа в Powershell {Известно, что хорошо {Powershell Work To Do}}}
Теперь в идеале все это должно выполняться из одного экземпляра консоли, чтобы все на выходе просто посмотреть. Ведение журнала exe -> powershell все работает нормально и, как и ожидалось, при использовании powershell.Streams .... Все команды write-hosts в PowerShell работают в консоли, и я получаю всю необходимую информацию.
powerShell.Streams.Information.DataAdded + = LogMessage;
Проблема возникает, когда вводится внешний модуль powershell. Это необходимо, потому что родительский процесс и среда выполнения, из которой он работает, - powershell. Как только весь этот стек запущен из экземпляра powershell, я получаю логирование консоли из внешнего PowerShell и из exe. НО все записи-хосты из внутренних модулей powershell исчезают.
Я пытался отключить перенаправления потока и некоторые другие вещи, но это не решается так, как я надеюсь. Я надеюсь, что кто-то знает, есть ли способ заставить это работать, поскольку это решает так много проблем, если это просто так.
PowerShell Внешний:
$C#Exe = Join-Path $PSScriptRoot $C#ExePath
$C#Args = @()
Write-Host "Hello world" # will show up
& $C#Exe $C#Args
C# Exe Код:
public static void Main(string[] args)
{
Console.WriteLine("Hello world"); #Will show up
var powerShell = PowerShell.Create().AddScript("PowerShellInner.ps1");
powerShell.Streams.Information.DataAdded += LogMessage<InformationRecord>;
powerShell.Streams.Warning.DataAdded += LogMessage<WarningRecord>;
powerShell.Streams.Error.DataAdded += LogMessage<ErrorRecord>;
powerShell.Streams.Verbose.DataAdded += LogMessage<VerboseRecord>;
powerShell.Streams.Debug.DataAdded += LogMessage<DebugRecord>;
StringBuilder resultString = new StringBuilder();
foreach (dynamic item in powerShell.Invoke().ToList())
{
resultString.AppendLine(item.ToString());
}
Console.WriteLine(resultString.ToString());
}
private static void LogMessage<T>(object sender, DataAddedEventArgs e)
{
var data = (sender as PSDataCollection<T>)[e.Index];
Console.WriteLine($"[{typeof(T).Name}] {Convert.ToString(data)}");
}
PowerShell Внутренний:
Write-Host "Hello world" #Wont show up