Meminta / mengeksekusi perintah dengan jumlah parameter yang tidak diketahui, di PowerShell


1

Ingin mengeksekusi Invoke-Expression dengan parameter yang dapat bervariasi tergantung pada input

Memiliki masalah dengan $MyArgs logika. Seharusnya hanya berisi parameter yang dimasukkan

Masukan (contoh):

./foo.ps1 -Name aa -Server bb -Datastore cc

Keluaran:

Get-VM -Name aa -Server bb -Datastore cc

Kode:

    [cmdletbinding(DefaultParameterSetName='Get-VM')]
    Param(
        #Common params
        [Parameter(ParameterSetName='Get-VM')]
        [Parameter(ParameterSetName='Get-Datastore')]
        [Parameter(Position = 0)]
        [String]$Name,     

        [Parameter(ParameterSetName='Get-VM')]
        [Parameter(ParameterSetName='Get-Datastore')]
        [Parameter(Position = 1)]
        [String]$Server,

        #Get-VM params
        [Parameter(ParameterSetName='Get-VM')]
        [String]$Datastore,
        [Parameter(ParameterSetName='Get-VM')]
        .
        .
        .

        #Get-Datastore params
        [Parameter(ParameterSetName='Get-Datastore')]
        [String]$Datacenter,        
        .
        .
        .
    )

Invoke-Expression -Command "$PSCmdlet.ParameterSetName $MyArgs" \\ <--- here is my problem

Saya bisa menggunakan Command, tetapi eksekusi akan dilakukan di localhost
igor

Jawaban:


1

Kami akan menggunakan tiga fitur PowerShell:

  • Operator panggilan, &, memanggil perintah yang namanya dapat ditentukan oleh ekspresi. Tidak seperti itu Invoke-Expression, ia dapat menangani parameter terikat tanpa meregangkan segalanya.
  • Itu $PSBoundParameters variabel adalah hashtable dari parameter yang ditentukan untuk cmdlet saat ini dan nilainya.
  • Pukulan seperti kebalikan dari $PSBoundParameters: ia menggunakan hashtable sebagai parameter terikat ke cmdlet.

Menyatukan semuanya, kami mengganti Anda Invoke-Expression doa dengan ini, memanggil cmdlet yang namanya parameter set nama dan meneruskannya semua parameter fungsi:

& $PSCmdlet.ParameterSetName @PSBoundParameters

Keren, bekerja seperti yang diharapkan, kesederhanaan adalah jenius :) Hanya belajar cara menggunakan parameter di PowerShell, jadi sangat menghargai informasi dan penjelasan tambahan
igor
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.