与PowerShell Cmdlets交互

7
我一直在编写一些使用PowerShell Cmdlets for App-V的实用程序。有趣的是,微软似乎只记录了Cmdlets而没有记录Powershell模块背后使用的.net程序集。
我熟悉P/Invoke和COM互操作,并学习了如何使用System.Management.Automation创建powershell会话并调用cmdlets。
但是,这里有些不对劲。我基本上正在编写自己的包装器类,以隐藏来自代码其余部分的powershell调用。似乎我应该要么a)绕过powershell,直接使用其背后的托管库,要么b)应该有更好的机制来生成powershell cmdlets的Interop库。
看起来微软现在正在大量使用PS CmdLets,它基本上成为与之交互的新API。
我是否遗漏了什么?在这种情况下使用什么策略比较好?

有人有什么想法吗? - Christopher Painter
你有具体的 cmdlet 示例吗? - GalacticJello
http://technet.microsoft.com/en-us/library/jj713419.aspx - Christopher Painter
2个回答

1

关于“味道”,你说得对。 绕过PowerShell不是编写实用程序的最佳方式,因为其背后的未记录的托管库更有可能在静默更改比cmdlets。使用这种方法可能会让你陷入麻烦。

你正在尝试组合难以组合的东西。 解决方案是引入代理,以更自然的方式将您的代码与ps cmdlet结合起来。

在您的情况下,可以创建与cmdlet以自然方式通信并提供所需功能的ps脚本。在您的c#代码中,您只需调用powershell.exe即可。如果这对您来说也不太对劲,那么只需使用System.Management.Automation创建powershell会话并调用您的脚本。这种方法更安全,因为现在您使用文档记录的ps cmdlet在您的powershell代理(自然powershell方式)中进行通信,并从c#代码中与您的ps脚本进行通信(这使您对代码更具控制力)


但是,API仅以cmdlet形式发布的趋势是否会让人感到困惑?就像他们只考虑了管理员而忽略了开发人员一样。 - Christopher Painter
可能他们只是针对大部分API用户发布cmdlet,因为这确实是管理员自动化工作最容易的方式。他们没有必要浪费开发时间以其他方式来实现它。 - Max Tkachenko

1
尽管有些困难,但是通过System.Management.Automation与交互的cmdlets并将结果转换为强类型对象是解决问题最稳定的方式。看看微软自己的AppV客户端托盘应用程序,它提供了运行完成所有任务所需的PowerShell命令。您可能会成功访问提供cmdlets的托管库,但正如您指出的那样,它们未经记录且很可能会发生更改。即使如此,如果不使用PowerShell,您可能会错过一些东西,例如从Get-AppVirtualProcess获取的AppVPackageData NoteProperty。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接