用powershell Crescendo模块,把【linux字符命令】包装成【powershell对象命令】
这是翻译文章,原文 : https://devblogs.microsoft.com/powershell/announcing-powershell-crescendo-preview-1/
问:powershell Crescendo模块有啥用?
答:
powershell对象命令很好。但是,linux本机命令实现不了。
linux命令具有自己独特的语法,有时包含许多子命令和参数/开关,并且通常类似于其自身的语言。可以选择利用PowerShell的技能来【包装老的字符界面命令】,或者更加精通已使用的本机命令,这不是很好吗?
作为PowerShell用户,如果这些本机命令支持PowerShell功能,例如:
- 明确的命名约定–
Verb-Noun
- 相似用途的一致参数命名
- 输出由对象组成
- 获取命令帮助的常用方法
- 易于处理管道中的对象
- 易于使用模块共享
我们很高兴宣布PowerShell Crescendo的首次预览,PowerShell Crescendo是一个框架,可以快速地把【linux本机命令】封装成PowerShell cmdlet,输出属性,支持Sort-Object
Where-Object
过滤。 而与平台无关。win,linux通用。
太好啦!包装(封装)成powershell命令后,就再也不用扣字符串了!
当今许多现代的本机命令都很复杂,它们本身是微型外壳,具有包含子级别或子上下文的自己的微型语言。如果你曾经使用过kubectl
,docker
或者,你所经历的执行和自动化这些命令的复杂性。netsh.exe
为了使本机命令具有类似于PowerShell的感觉并提供类似的体验,您可以自己重新编写该工具,或者,如果该工具使用该工具REST
,则可以使用AutoRest直接调用Web API 。这些选项效果很好,但是需要更多的开发经验,并且随着时间的推移可能很难维护。
Crescendo提供了一些工具,可以轻松包装本机命令以获得PowerShell cmdlet的优势。将本机命令包装到Crescendo cmdlet中可以提供参数处理,例如提示输入强制性参数和制表符完成参数值。Crescendo cmdlet可以从本机应用程序获取文本输出,并将其解析为对象。输出对象允许您利用所有的后期处理工具等优势,等等。Sort-Object
Where-Object
支持什么
Microsoft.PowerShell.Crescendo 0.4.1 Preview.1当前可从PowerShell画廊下载。
支持使用Crescendo编写模块的PowerShell版本:
- PowerShell 7.0以上
可以执行Crescendo模块的受支持的PowerShell版本:
- Windows PowerShell 5.1以上
- PowerShell 7.0以上
下一步是什么
Preview.2的Next / Future计划将基于反馈,并包括一些正在调查的项目:
- 生成模块时创建cmdlet别名
- 研究解析手册页和文档以改进自动JSON生成
安装
若要创建Crescendo cmdlet,您将需要PowerShell画廊中的模块Microsoft.PowerShell.Crescendo。
Install-Module Microsoft.PowerShell.Crescendo
文献资料
我们已包含about_Crescendo
,将来还会添加更多文档。确保检出模块中的Samples文件夹。
Get-Help about_Crescendo
要编写Crescendo模块,您将创建一个JSON配置文件,该文件描述了如何将本机命令投影为cmdlet。您需要Microsoft.PowerShell.Crescendo模块来构建包含Crescendo代理cmdlet的完成模块。该Microsoft.PowerShell.Crescendo在PowerShell中7+模块运行。
要使用由Crescendo构建的模块,您不需要安装Microsoft.PowerShell.Crescendo。只需下载或安装生成的模块,就可以了。由于Crescendo构建的模块与其他模块一样,因此Windows PowerShell 5.1及更高版本支持这些模块。您的工作可以帮助社区中的其他人自动化本机命令。幸运的是,发布到PowerShell画廊时,构建和共享Crescendo模块非常容易。
有关概念和设计方法的更多信息,请参见:
例子
把apt-list封装成powershell命令
这个例子建立在一个通用的Linux打包工具之上,apt
用于显示,安装和删除软件。Verb和Noun属性定义新cmdlet的名称。Get-InstalledPackage
Crescendo模块包括一个架构定义文件,用于帮助创建和编辑JSON配置文件。模式文件包含在模块中。在下面的示例中,模式文件被复制到具有正在开发的JSON文件的临时工作目录中。模式文件的位置在JSON配置中定义,可以位于任何位置。Microsoft.PowerShell.Crescendo.Schema.json
模式定义的通用属性:
Verb
:cmdlet动词的名称(检查有效的动词名称)Get-Verb
Noun
:cmdlet名词的名称OriginalName
:原始本机命令名称和位置OriginalCommandElements
:一些本机命令具有其他强制性开关,可在给定情况下正确执行OutputHandlers
:输出处理程序捕获从本机命令输出的字符串,并将其转换为结构化数据(对象)。与其他PowerShell cmdlet一样,可以在管道中进一步处理此对象输出。
语法:示例代码包含// <--
JSON中的注释()。它们仅用于描述目的,应删除。
{ "$schema": "./Microsoft.PowerShell.Crescendo.Schema.json", // <-- Schema definition file "Verb": "Get", // <-- Cmdlet Verb "Noun":"InstalledPackage", // <-- Cmdlet Noun "OriginalName": "apt", // <-- Native command "OriginalCommandElements": ["-q","list","--installed"], "OutputHandlers": [ // <-- Add string output to an object { "ParameterSetName":"Default", "Handler": "$args[0]| select-object -skip 1 | %{$n,$v,$p,$s = "$_" -split ' '; [pscustomobject]@{ Name = $n -replace '/now'; Version = $v; Architecture = $p; State = $s.Trim('[]') -split ',' } }" } ] }
以下示例显示了如何使用我们在JSON文件中定义的。Get-InstalledPackage
PS> Get-InstalledPackage | Where-Object { $_.name -match "libc"}
Name Version Architecture State
---- ------- ------------ -----
libc-bin 2.31-0ubuntu9.1 amd64 {installed, local}
libc6 2.31-0ubuntu9.1 amd64 {installed, local}
libcap-ng0 0.7.9-2.1build1 amd64 {installed, local}
libcom-err2 1.45.5-2ubuntu1 amd64 {installed, local}
libcrypt1 1:4.4.10-10ubuntu4 amd64 {installed, local}
PS> Get-InstalledPackage |