gpt4 book ai didi

c# - 如何从 C# 访问 PowerShell 主机

转载 作者:行者123 更新时间:2023-11-30 22:00:13 25 4
gpt4 key购买 nike

在 PowerShell 配置文件中,可以识别 PowerShell 主机以便对该主机的环境进行适当的设置。例如:

if ($host.Name -eq 'ConsoleHost')
{
Import-Module PSReadline
# differentiate verbose from warnings!
$privData = (Get-Host).PrivateData
$privData.VerboseForegroundColor = "cyan"
}
elseif ($host.Name -like '*ISE Host')
{
Start-Steroids
Import-Module PsIseProjectExplorer
}

我希望能够从 C# 上下文中进行等效识别,主要是因为 PowerShell ISE 不支持 Console.ReadLine,所以我想知道在当前环境中使用它是否安全PS宿主环境。

我首先尝试从 C# 中获取 Get-Host cmdlet 的输出(根据 Invoking a cmdlet within a cmdlet )。在我找到 Microsoft.PowerShell.Commands.Utility 程序集(在 C:\Program Files (x86)\Reference Assemblies\Microsoft\WindowsPowerShell\3.0 下)后,我可以编译它,但它产生了 null...

var cmd = new Microsoft.PowerShell.Commands.GetHostCommand();
var myHost = cmd.Invoke();

...虽然由于 InternalHost 类(具有讽刺意味的是!)是内部的,因此无法编译:

var cmd = new Microsoft.PowerShell.Commands.GetHostCommand();
var myHost = cmd.Invoke<System.Management.Automation.Internal.Host.InternalHost>();

接下来,我将我的 cmdlet 修改为从 PSCmdlet 而不是 Cmdlet 继承(以允许访问 SessionState),这样我就可以然后像这样访问 PS 主机对象:

var psVarObject = SessionState.PSVariable.GetValue("Host");

当然,这会返回一个纯 Object,然后我需要将其转换为......哦,等等......它仍然是内部的!......所以这不会编译:

string psHost = ((System.Management.Automation.Internal.Host.InternalHost)psVarObject).Name;

让我别无选择,只能在外国程序集上使用反射(恐怖!):

string psHost = (string)psVarObject.GetType().GetProperty("Name").GetValue(psVarObject, null);

这行得通,但并不理想,因为反射(reflection)任何第 3 方程序集都是一件脆弱的事情。

关于 (a) 识别主机或 (b) 备份一点,能够使用主机自己的 Read-Host cmdlet 从用户那里获取输入的任何替代想法?

最佳答案

你可以只使用Host PSCmdlet 类的属性。如果你想做 Read-Host:

Host.UI.ReadLine()

关于c# - 如何从 C# 访问 PowerShell 主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28724213/

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