gpt4 book ai didi

c# - 自定义 PSHostUserInterface 被 Runspace 忽略

转载 作者:太空狗 更新时间:2023-10-30 00:41:40 26 4
gpt4 key购买 nike

背景

我正在编写一个以编程方式执行 PowerShell 脚本的应用程序。此应用程序具有自定义 PSHost 实现,以允许脚本输出日志记录语句。目前,我看到的行为是 一些 请求被正确转发到我的自定义 PSHost 而其他请求则被完全忽略。

当我开始检查我的脚本中的 $Host 变量时,事情变得更加奇怪,这似乎表明我的自定义 PSHost 甚至没有被使用。

代码

我有一些在 .NET 应用程序中执行 PowerShell 的代码:

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 出现奇怪的行为?

最佳答案

您需要为 PSHostRawUserInterface 提供实现。

Write-Host 最终会调用您的 Write(ConsoleColor, ConsoleColor, string) 版本。 PowerShell 依赖于前景色和背景色的原始 UI 实现。

我已经用示例代码验证了这一点。我没有调用 ps1 文件,而是直接调用了 Write-Host:

powershell.AddCommand("Write-Host").AddParameter("Testing...")

通过运行脚本,PowerShell 为您处理异常。通过直接调用命令,您可以更轻松地查看异常。如果您在原始示例中检查了 $error,您会看到一个有用的错误。

请注意 $host 的值永远不是实际的实现。 PowerShell 通过包装隐藏实际实现。我忘记了它为什么被包裹的确切细节。

关于c# - 自定义 PSHostUserInterface 被 Runspace 忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19163980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com