🔬 Microsoft PowerShell Crescendo – pierwsze wrażenia

By PowerShell

Kilka dni temu Microsoft ogłosił poglądowe wydanie modułu Microsoft.PowerShell.Crescendo do owijania w ustrukturyzowany sposób natywnych poleceń w funkcje PowerShell.

Autorzy proponują wykorzystanie pliku w formacie JSON (co chyba nie dokońca jest dobrym pomysłem, czego potwierdzenie jest ilości negatwynych komentarzy), który musimy przygotować zgodnie ze schematem.

Dokumentacja modułu Microsoft.PowerShell.Crescendo na tą chwilę jest uboga. Należy pamiętać, że to dopiero pierwsze preview i sporo może się zmienić ale mimo to sama koncepcja wydała mi się ciekawa więc podjąłem pierwsze próby.

Do przygotowanie praktycznie pustego schematu, można wykorzystać poniższe polecenie.

New-CrescendoCommand -Verb <verb> -Noun <noun> -Verbose | ConvertTo-Json -Depth 5 | Out-File example.json
 
//  pusty example.json
{
  "Verb": "Get",
  "Noun": "DockerContainer",
  "OriginalName": null,
  "OriginalCommandElements": null,
  "Aliases": null,
  "DefaultParameterSetName": null,
  "SupportsShouldProcess": false,
  "SupportsTransactions": false,
  "NoInvocation": false,
  "Description": null,
  "Usage": null,
  "Parameters": [],
  "Examples": [],
  "OriginalText": null,
  "HelpLinks": null,
  "OutputHandlers": null
}

Na tą chwile funkcja ta nie ma innych parametrów niż te które użyłem wyżej. Przypuszczam, że w kolejnych wersjach będzie ona pozwalała na więcej.

Dalej to tylko praca na przykładach oraz na wcześniej wspomianym schemacie. Efektem tego było owinięcie polecenia docker ps.

{
  "Verb": "Get", //required
  "Noun": "DockerContainer", //required
  "OriginalName": "docker", //required
  "OriginalCommandElements": [
    "ps",
    "--format",
    "{{json .}}"
  ],
  "Aliases": null,
  "DefaultParameterSetName": null,
  "SupportsShouldProcess": false,
  "SupportsTransactions": false,
  "NoInvocation": false,
  "Description": "The example of use the Microsoft.PowerShell.Crescendo module",
  "Usage": null,
  "Parameters": [
    {
      "Name": "Force",
      "OriginalName": "--all",
      "ParameterType": "switch"
    },
    {
      "Name": "Filter",
      "NoGap": false,
      // --filter
      // name=th
      // if NoGap: true
      // --filter"name=th"
      "OriginalName": "--filter",
      "ParameterType": "string"
    }
  ],
  "Examples": [
    {
      "Command": "Get-DockerContainer",
      "OriginalCommand": "docker ps",
      "Description": "List containers",
      "OriginalText": null
    },
    {
      "Command": "Get-DockerContainer -Force",
      "OriginalCommand": "docker ps -a",
      "Description": "List all containers",
      "OriginalText": null
    },
    {
      "Command": "Get-DockerContainer -Force -Filter",
      "OriginalCommand": "docker ps -a -f",
      "Description": "Filter output based on conditions provided",
      "OriginalText": null
    }
  ],
  "OriginalText": null,
  "HelpLinks": null,
  "OutputHandlers": [
    {
      "ParameterSetName": "Default", //required
      "Handler": "if($args) {$args[0] | ConvertFrom-Json}" //required
    }
  ]
}

Na podstawie pliku json, poleceniem Export-CrescendoModule generujesz moduł a właściwie plik psm1. Zobacz jak wygląda funkcja, w tym module.

Export-CrescendoModule -ConfigurationFile .\example.docker.json -ModuleName docker -Force

Na końcu to tylko import modułu oraz próba wykorzystania owiniętego przez nas polecenia. Taka przygotowany moduł ma poprawnie działać zarówno dla Windows PowerShell jak i PowerShell 7 (i tak było u mnie).

Jednak w dużej mierze to zależy od tego czy np. w OutputHandlers nie użyjemy składni lub cmdletu niewspieranego pomiędzy wersjami.

Import-Module .\docker.psm1
 
# example 1
Get-DockerContainer
 
# example 2
Get-DockerContainer -Force 
 
# example 3
Get-DockerContainer -Force -Filter 'name=th'
 
# Command      : "dotnet HotelReserva…"
# CreatedAt    : 2020-03-19 15:52:07 +0100 CET
# ID           : ed41424ee78f
# Image        : reservationsystem
# Labels       :
# LocalVolumes : 0
# Mounts       :
# Names        : thirsty_driscoll
# Networks     : nat
# Ports        :
# RunningFor   : 9 months ago
# Size         : 0B
# State        : exited
# Status       : Exited (2147516566) 9 months ago
22 Najważniejsze Wskazówki Pisania Skryptów PowerShell

No comments yet.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

Witryna wykorzystuje Akismet, aby ograniczyć spam. Dowiedz się więcej jak przetwarzane są dane komentarzy.

× Close