Фон
Я пишу приложение, которое программно выполняет сценарии PowerShell. Это приложение имеет пользовательскую реализацию PSHost
, позволяющую сценариям выводить операторы регистрации. В настоящее время я наблюдаю следующее: некоторые запросы правильно перенаправляются на мой пользовательский PSHost
, а другие просто игнорируются.
Все становится еще более странным, когда я начал проверять переменную $Host
в своих сценариях, которые, кажется, предполагают, что моя пользовательская PSHost
даже не используется.
Код
У меня есть код, выполняющий PowerShell в приложении .NET:
var state = InitialSessionState.CreateDefault();
state.AuthorizationManager = new AuthorizationManager("dummy"); // Disable execution policy
var host = new CustomPsHost(new CustomPsHostUI());
using (var runspace = RunspaceFactory.CreateRunspace(host, state))
{
runspace.Open();
using (var powershell = PowerShell.Create())
{
powershell.Runspace = runspace;
var command = new Command(filepath);
powershell.Invoke(command);
}
}
Реализация для CustomPsHost
очень минимальна, содержит только то, что необходимо для пересылки PSHostUserInterface
:
public class CustomPsHost : PSHost
{
private readonly PSHostUserInterface _hostUserInterface;
public CustomPsHost(PSHostUserInterface hostUserInterface)
{
_hostUserInterface = hostUserInterface;
}
public override PSHostUserInterface UI
{
get { return _hostUserInterface; }
}
// Methods omitted for brevity
}
CustomPsHostUI используется как оболочка для ведения журнала:
public class CustomPsHostUI : PSHostUserInterface
{
public override void Write(string value) { Debug.WriteLine(value); }
public override void Write(ConsoleColor foregroundColor, ConsoleColor backgroundColor, string value){ Debug.WriteLine(value); }
public override void WriteLine(string value) { Debug.WriteLine(value); }
public override void WriteErrorLine(string value) { Debug.WriteLinevalue); }
public override void WriteDebugLine(string message) { Debug.WriteLine(message); }
public override void WriteProgress(long sourceId, ProgressRecord record) {}
public override void WriteVerboseLine(string message) { Debug.WriteLine(message); }
// Other methods omitted for brevity
}
В моем сценарии PowerShell я пытаюсь записать информацию на хост:
Write-Warning "This gets outputted to my CustomPSHostUI"
Write-Host "This does not get outputted to the CustomPSHostUI"
Write-Warning $Host.GetType().FullName # Says System.Management.Automation.Internal.Host.InternalHost
Write-Warning $Host.UI.GetType().FullName # Says System.Management.Automation.Internal.Host.InternalHostUserInterface
Почему у меня странное поведение с моим CustomPSHostUI
?
RawUI
, мне это не нужно:If you are also implementing a PSHostRawUserInterface class, return an instance of the class.
- person Mike Bailey   schedule 04.10.2013