Udostępnij za pomocą


Przekształcanie argumentów w crescendo

Istnieje wiele scenariuszy, w których wartości wejściowe przekazane do zawiniętego polecenia Crescendo muszą zostać przetłumaczone na inny format dla bazowego polecenia natywnego. Crescendo 1.1 dodał dwa nowe elementy członkowskie do klasy parametrów , i w celu obsługi tych scenariuszy. Te elementy członkowskie są podobne do członków Handler i HandlerType.

Wartość ArgumentTransformType określa, w jaki sposób wartość ArgumentTransform jest interpretowana. Musi to być jedna z następujących wartości:

  • Inline — wartość ArgumentTransform jest ciągiem, który ma zostać oceniony jako blok skryptu. Jest to wartość domyślna, gdy nie określono żadnej wartości.
  • Function — wartość ArgumentTransform jest nazwą funkcji załadowanej w bieżącej sesji.
  • Script — wartość ArgumentTransform to nazwa pliku skryptu znalezionego na dysku.

W tym przykładzie polecenie natywne oczekuje rozdzielanej przecinkami listy wartości parametru --p2. Parametr polecenia cmdlet, ValueList, jest tablicą ciągów. Crescendo przekazuje $ValueList do blokady skryptu w ArgumentTransform jako tablicy ciągów. Scriptblock łączy wartości w tablicy z przecinkiem i zwraca wynik.

"Parameters": [
    {
        "Name": "ValueList",
        "OriginalName": "--p2",
        "ParameterType": "string[]",
        "OriginalPosition": 1,
        "ArgumentTransform": "param([string[]]$v) $v -join ','"
    }
]

Przykład — dodawanie zmiennych środowiskowych do obrazu platformy Docker

Poniższa konfiguracja crescendo definiuje polecenie cmdlet Start-DockerRun, które opakowuje polecenie docker run. Parametr Environment to tabela skrótu zawierająca pary klucz-wartość, które należy przekształcić w argumenty dla parametru --env polecenia docker run. Podczas definiowania wielu zmiennych środowiskowych polecenia docker run oczekuje wystąpienia --env key=value dla każdej zmiennej. Nie jest to możliwe bez używania przekształcenia argumentu.

{
    "$schema": "https://aka.ms/PowerShell/Crescendo/Schemas/2022-06",
    "Commands": [
        {
            "Verb": "Start",
            "Noun": "DockerRun",
            "OriginalName": "docker",
            "OriginalCommandElements": [
                "run",
                "--rm",
                "-it"
            ],
            "Parameters": [
                {
                    "Name": "Environment",
                    "OriginalName": "",
                    "ParameterType": "Hashtable",
                    "OriginalPosition": 0,
                    "ArgumentTransform": "param([Hashtable]$v) $v.Keys|Foreach-Object {''--env''; ''{0}={1}'' -f $_, $v[$_]}"
                },
                {
                    "Name": "Image",
                    "OriginalName": "",
                    "ParameterType": "string",
                    "DefaultValue": "ubuntu:latest",
                    "OriginalPosition": 10
                }
            ],
            "OutputHandlers": [
                {
                    "ParameterSetName": "Default",
                    "HandlerType": "ByPass"
                }
            ]
        }
    ]
}

Transformator argumentów zwraca --env key=value dla każdej pary klucz-wartość w tabeli skrótu.

Przykład — konwertowanie obiektu PSCredential na nazwę użytkownika i hasło

W tym przykładzie konfiguracja crescendo definiuje polecenie cmdlet Connect-WindowsShare, które opakowuje polecenie net use. Parametr Credential jest obiektem PSCredential, który musi zostać przekonwertowany na nazwę użytkownika i hasło dla polecenia net use.

{
    "$schema": "https://aka.ms/PowerShell/Crescendo/Schemas/2022-06",
    "Commands": [
        {
            "Verb": "Connect",
            "Noun": "WindowsShare",
            "OriginalName": "NET.exe",
            "Platform": [
                "Windows"
            ],
            "OriginalCommandElements": [ "USE" ],
            "Parameters": [
                {
                    "Name": "DriveName",
                    "OriginalName": "",
                    "DefaultValue": "*",
                    "ParameterType": "string",
                    "OriginalPosition": 0
                },
                {
                    "Name": "Share",
                    "OriginalName": "",
                    "Mandatory": true,
                    "OriginalPosition": 1,
                    "ParameterType": "string"
                },
                {
                    "Name": "Credential",
                    "OriginalName": "",
                    "ParameterType": "PSCredential",
                    "Mandatory": true,
                    "OriginalPosition": 10,
                    "ArgumentTransform": "\"/USER:$($Credential.UserName)\";$Credential.GetNetworkCredential().Password",
                    "ArgumentTransformType": "Inline"
                }
            ]
        }
    ]
}

Transformator argumentu konwertuje obiekt PSCredential na /USER:username password dla polecenia net use.