Voici mon code:
$script={ Write-Host "Num Args:" $args.Length; Write-Host $args[0] } Invoke-Command -ScriptBlock $script
Quand je cours
powershell.exe .\test.ps1 one two three
j’ai eu
Num Args: 0
Je pensais obtenir
Num Args: 3 One
Quelque chose me manque?
Merci
Vous avez effectivement deux scopes là-bas. Le niveau de script et le niveau de bloc de script. $args.Length
et $args[0]
auront ce que vous attendez au niveau Invoke-Command
. Dans le bloc de script, il y a une autre scope pour $args
. Pour obtenir les arguments de la ligne de commande dans le bloc de script, vous devez les repasser depuis Invoke-Command -ArgumentList $args
.
Vous devez transmettre les arguments au scriptblock:
Invoke-Command -ScriptBlock $script -ArgumentList $args
Vous pouvez également déclarer explicitement des parameters nommés. Par exemple:
param([switch]$someBoolSwitch=$false, [Ssortingng]$nameOfSomething="some default ssortingng")
Cela vous permet de transmettre des arguments nommés à votre script, comme dans l’exemple suivant:
.\
et si vous avez omis -nameOfSomething "Slayer Roolz!"
, alors $nameOfSomething
serait simplement "some default sting"
. De même, $someBoolSwitch
est $someBoolSwitch
défaut sur $false
sauf indication contraire.
Cette méthode a l’avantage de vous permettre, en tant que développeur, de décider quels parameters sont nécessaires et lesquels peuvent être omis ou par défaut. En outre, il permet à l’utilisateur de saisir des arguments dans l’ordre de son choix, car ils sont nommés et non positionnés.
Un inconvénient d’avoir des parameters nommés par opposition à des parameters de position est que l’invocation de ligne de commande peut devenir assez importante car l’utilisateur doit taper chaque nom de paramètre.