Arguments de ligne de commande Powershell

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:

.\ -someBoolSwitch -nameOfSomething "Slayer Roolz!"

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.