PowerShell免费软件

用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命令后,就再也不用扣字符串了!

 

当今许多现代的本机命令都很复杂,它们本身是微型外壳,具有包含子级别或子上下文的自己的微型语言如果你曾经使用过kubectldocker或者,你所经历的执行和自动化这些命令的复杂性。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用于显示,安装和删除软件。VerbNoun属性定义新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免费软件  阅读(231)  评论(0编辑  收藏  举报

导航