如何在应用程序中向PowerShell公开功能

时间:2009-05-20 13:34:11

标签: c# powershell

我正在收听有关PowerShell 2.0 that Scott Hanselman did的播客。在那一集中,他们讨论了扩展应用程序以展示PowerShell功能的可能性。

现在这听起来很有趣。 你有没有做过这样的扩展,在你的应用程序中公开功能? 如果是这样,那么什么样的功能?

编辑: 更确切地说:我对在我的应用程序中托管PowerShell不感兴趣。我更感兴趣的是使用类似API的界面打开我的应用程序。因此,PowerShell提供商似乎是我正在寻找更多洞察力的技术。

3 个答案:

答案 0 :(得分:4)

在自定义应用程序中有多种方法可以利用PowerShell。 PowerShell自动化引擎的优点在于您无需处理处理参数,格式化输出以及您必须自己处理的其他PITA内容。要在PowerShell中将对象抛出管道,可以覆盖ProcessRecord方法并调用WriteObject

protected override void ProcessRecord()
{
  // Get the current processes
  Process[] processes = Process.GetProcesses();

  // Write the processes to the pipeline making them available
  // to the next cmdlet. The second parameter of this call tells 
  // PowerShell to enumerate the array, and send one process at a 
  // time to the pipeline.
  WriteObject(processes, true);
}

您可以编写允许管理员自动化应用程序服务器端的Cmdlet。 Cmdlet总是基于任务的功能单元,具有动词 - 名词命名约定。例如,Get-Process或Restart-Service。 Cmdlet做一件事并做得很好。将cmdlet组合在一起会带来各种令人难以置信的强大功能。

此外,如果您的应用程序具有某种数据存储,则还可以编写一个提供程序,允许某人使用cmd(如cd(set-location)和md(新项目)浏览和/或管理数据存储)。提供者是PS团队编写的,因此您可以使用cd hklm:或使用cd cert的证书存储区进入注册表:

您也可以在应用程序中托管PowerShell。

MSDN here

上的所有这三个选项都有一些很好的信息

考虑到对提供者的兴趣,以下是how to create a PowerShell Provider.

的一些示例

有一些关于设计和使用一组cmdlet或使用Provider公开内容的讨论。实现提供程序时,还会获得一些cmdlet,例如Get-item,New-item,Get-Location,Set-Location。但是,我发现除了提供程序之外,为特定任务设置一些cmdlet可能非常有用。

答案 1 :(得分:2)

有几个级别的PowerShell支持,并没有多少人能够很好地解释这一点。

  1. .NET类。是的,PowerShell可以访问任何带有.NET API的内容,而无需您做任何额外的事情!但是,您没有获得所有额外的PowerShell功能。最少的工作量。
  2. 包含cmdlet,脚本和/或函数的PowerShell模块。这将需要编写一些PowerShell特定代码来包装您现有的API。如果你走这条路,你应该坐下来学习PowerShell设计的最佳实践并思考你的PowerShell支持。这是做正确的工作所需的更多工作。
  3. PowerShell提供商。提供商是一个特例,并非一切都应该有提供者。您需要在文件系统视图中真正考虑您的信息是否真的有意义。
  4. 这不适用于您的问题,但我会将其添加为完整性。

    1. 托管PowerShell。您可以在应用中托管PowerShell代码,也可以从应用中访问PowerShell功能。这在某些情况下是有意义的,但也是PowerShell支持的一个特殊情况。

答案 2 :(得分:2)

这是关于powershell这方面的一本好书(在大多数书中都没有得到很多报道)。

Professional Poweshell Programming

使用这本书(以及一些msdn的旅行),我能够在一天内完成并运行自定义PowerShell主机。几天后,我有了与gui交互的自定义​​cmdlet(用于构建树视图,网格,图表,菜单等)。