web-dev-qa-db-fra.com

Obtention de tous les paramètres nommés de Powershell, y compris ceux vides et définis

J'essaie de trouver un moyen d'obtenir toutes les informations sur les paramètres à partir d'un script PowerShell. Ex script:

function test()
{
    Param(
        [string]$foo,
        [string]$bar,
        [string]$baz = "baz"
    )

    foreach ($key in $MyInvocation.BoundParameters.keys)
    {
        write-Host "Parameter: $($key) -> $($MyInvocation.BoundParameters[$key])"
    }
}
test -foo "foo!"

J'aimerais obtenir les valeurs de $bar et $baz de manière dynamique sans connaître le nom des paramètres à l'avance.

J'ai examiné les propriétés et les méthodes $MyInvocation, mais je ne vois rien en dehors des paramètres définis/passés.

Mise à jour 1:

Je suis sur le point de l'obtenir avec:

function test()
{
    Param(
        [string]$foo,
        [string]$bar,
        [string]$baz = "baz"
    )
    foreach($var in (get-variable -scope private))
    {
        write-Host "$($var.name) -> $($var.value)"
    }
}
test -foo "foo!"

Si je pouvais filtrer les paramètres de script par rapport aux paramètres par défaut, je serais prêt à partir.

Mise à jour 2: La solution de travail finale ressemble à ceci:

function test {
    param (
          [string] $Bar = 'test'
        , [string] $Baz
        , [string] $Asdf
    )
    $ParameterList = (Get-Command -Name $MyInvocation.InvocationName).Parameters;
    foreach ($key in $ParameterList.keys)
    {
        $var = Get-Variable -Name $key -ErrorAction SilentlyContinue;
        if($var)
        {
            write-Host "$($var.name) > $($var.value)"
        }
    }
}

test -asdf blah;
10
Eric Longstreet

Vérifiez cette solution. Cela utilise l'attribut CmdletBinding(), qui fournit des métadonnées supplémentaires grâce à l'utilisation de la variable intégrée $PSCmdlet. Vous pouvez:

  1. Récupérer dynamiquement le nom de la commande en utilisant $PSCmdlet
  2. Obtenir une liste du paramètre pour la commande, en utilisant Get-Command
  3. Examinez la valeur de chaque paramètre à l'aide de la cmdlet Get-Variable.

Code:

function test {
    [CmdletBinding()]
    param (
          [string] $Bar = 'test'
        , [string] $Baz
        , [string] $Asdf
    )
    # Get the command name
    $CommandName = $PSCmdlet.MyInvocation.InvocationName;
    # Get the list of parameters for the command
    $ParameterList = (Get-Command -Name $CommandName).Parameters;

    # Grab each parameter value, using Get-Variable
    foreach ($Parameter in $ParameterList) {
        Get-Variable -Name $Parameter.Values.Name -ErrorAction SilentlyContinue;
        #Get-Variable -Name $ParameterList;
    }
}

test -asdf blah;

Sortie

Le résultat de la commande ressemble à ceci:

Name                           Value                                           
----                           -----                                           
Bar                            test                                            
Baz                                                                            
Asdf                           blah                                            
20
Trevor Sullivan

Pour lire la valeur de manière dynamique, utilisez la get-variable fonction/cmdlet

write-Host (get-variable "foo")

Pour imprimer tous les paramètres, procédez comme suit:

foreach ($key in $MyInvocation.BoundParameters.keys)
{
    $value = (get-variable $key).Value 
    write-Host "$key -> $value"
}
11
JaredPar

J'ai trouvé cela très utile pour la PS4 (Windows 2012 R2) - il inclut les valeurs par défaut/les paramètres facultatifs:

$cmdName = $MyInvocation.InvocationName
$paramList = (Get-Command -Name $cmdName).Parameters
foreach ( $key in $paramList.Keys ) {
    $value = (Get-Variable $key -ErrorAction SilentlyContinue).Value
    if ( $value -or $value -eq 0 ) {
        Write-Host "$key -> $value"
    }
}
2
cslotty

J'ai joué avec les 2 solutions que j'ai aimé dans ce fil, elles fonctionnent toutes les deux. cependant je devais produire une erreur sur le paramètre manquant pour un script de construction

   $cmdName = $MyInvocation.InvocationName 
   $paramList = (Get-Command -Name $cmdName).Parameters
     foreach ( $key in $paramList.Keys ) {
     $value = (Get-Variable $key -ErrorAction Stop)
     #Write-Host $value.Value #remove comment for error checking
        if ([string]::IsNullOrEmpty($value.Value)){ 
        $(throw ("$key is a mandatory value please declare with -$key <Required value> " ))
        }
       }
1
Kelly Davis

Espérons que certains trouveront ce one-liner utile:

function test()
{
    Param(
        [string]$foo,
        [string]$bar,
        [string]$baz = "baz"
    )

    $MyInvocation.MyCommand.Parameters | Format-Table -AutoSize @{ Label = "Key"; Expression={$_.Key}; }, @{ Label = "Value"; Expression={(Get-Variable -Name $_.Key -EA SilentlyContinue).Value}; }
}
test -foo "foo!"

Résultat

Keys Value
---- -----
foo  foo! 
bar       
baz  baz  
0
Janos