用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 | Group-Object -Property Architecture
Count Name Group
----- ---- -----
10 all {@{Name=adduser; Version=3.118ubuntu2; Architecture=all; State=System.String[}, @{Name=debconf; V…
82 amd64 {@{Name=apt; Version=2.0.2ubuntu0.1; Architecture=amd64; State=System.String[]}, @{Name=base-files…
把win的ipconfig.exe,封装成powershell命令
本示例包装了Windows命令并说明了如何定义参数。除了以上示例中的属性外,该架构还支持一个部分,用于将描述性命名的参数包装和投影到新cmdlet中。ipconfig.exe
Parameters
Name
:显示在新cmdlet中的参数名称OriginalName
:出现在本机命令中的原始参数名称
{ "$schema" : "./Microsoft.PowerShell.Crescendo.Schema.json", "Verb": "Get", "Noun": "IpConfig", "OriginalName":"c:/windows/system32/ipconfig.exe", "Description": "This will display the current IP configuration information on Windows", "Parameters": [ // <-- Parameter definition { "Name":"All", // <-- Name of parameter that appears in cmdlet "OriginalName": "/all", // <-- Name of original parameter that appears in native cmd "ParameterType": "switch", "Description": "This switch provides all ip configuration details" // <-- Help parameter }, { "Name":"AllCompartments", "OriginalName": "/allcompartments", "ParameterType": "switch", "Description": "This switch provides compartment configuration details" } ], "OutputHandlers": [ { "ParameterSetName": "Default", "Handler":"param ( $lines ) $post = $false; foreach($line in $lines | ?{$_.trim()}) { $LineToCheck = $line | select-string '^[a-z]'; if ( $LineToCheck ) { if ( $post ) { [pscustomobject]$ht |add-member -pass -typename $oName } $oName = ($LineToCheck -match 'Configuration') { 'IpConfiguration' } else {'EthernetAdapter'} $ht = @{}; $post = $true } else { if ( $line -match '^ [a-z]' ) { $prop,$value = $line -split ' :',2; $pName = $prop -replace '[ .-]'; $ht[$pName] = $value.Trim() } else { $ht[$pName] = .{$ht[$pName];$line.trim()} } } } [pscustomobject]$ht | add-member -pass -typename $oName" } ] }
从JSON配置导出代理模块
导出Crescendo JSON配置文件会生成一个PowerShell模块,该模块可以在本地,GitHub和PowerShell库上共享。Crescendo包含从JSON配置文件生成代理模块的cmdlet。Export-CrescendoModule
- 该的ConfigurationFile参数应包括名称和路径JSON配置文件。
- 该模块名参数包含导出的模块的名称。
Export-CrescendoModule -ConfigurationFile .get-ipconfig.crescendo.json -ModuleName Ipconfig.psm1
使用您的Crescendo模块
使用Crescendo创建模块后,就可以像安装其他模块一样安装和导入它。请记住,无论在哪里安装Crescendo模块,您都将需要原始的本机命令。
PS> Import-Module .ipconfig.psm1
PS> Get-IpConfig -All | Select-Object -Property ipv4address, DefaultGateway, subnetmask
ipv4address DefaultGateway subnetmask
----------- -------------- ----------
172.24.112.1 255.255.240.0
192.168.94.2 {fe80::145e:1779:5cfa:c2a5%8, 192.168.94.1} 255.255.255.0
您将如何提供帮助
我们的目标是使将本机命令转换为PowerShell cmdlet并获得PowerShell提供的好处变得更加容易。我们重视您的想法和反馈,希望您能尝试一下Crescendo,然后在我们的GitHub存储库前停下来,让我们知道您想要添加的任何问题或功能。
有关PowerShell Crescendo问题和功能的更多信息,请参见:GitHub上的Crescendo
Jason Helmick PowerShell程序经理
posted on 2020-12-12 23:49 PowerShell免费软件 阅读(243) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端