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;
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:
$PSCmdlet
Get-Command
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;
Le résultat de la commande ressemble à ceci:
Name Value
---- -----
Bar test
Baz
Asdf blah
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"
}
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"
}
}
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> " ))
}
}
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