在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主机环境中使用它是否安全。
我首先探索了如何从Get-Host (每个调用cmdlet中的cmdlet )中获取C# cmdlet的输出。在我找到Microsoft.PowerShell.Commands.Utility程序集(在C:\Program (x86)\Reference \Microsoft\WindowsPowerShell\3.0下)之后,我可以编译这个程序集,但是它产生了空.
var cmd = new Microsoft.PowerShell.Commands.GetHostCommand();
var myHost = cmd.Invoke();...while,这将不会编译,因为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);这是可行的,但并不理想,因为反思任何第三方大会都是一件很脆弱的事情。
对于(a)识别主机或(b)备份一点,能够使用主机自己的读主机cmdlet从用户那里获得输入,有什么其他的想法吗?
发布于 2015-02-25 17:02:44
您只需从主机类中使用PSCmdlet属性即可。如果你想做Read-Host
Host.UI.ReadLine()发布于 2015-04-22 16:36:01
当得到
var psVarObject = SessionState.PSVariable.GetValue("Host");您可以将其转换为System.Management.Automation.Host.PSHost而不是InternalHost。
https://stackoverflow.com/questions/28724213
复制相似问题