93 votes

Passer un paramètre d'un fichier batch à un script PowerShell

Dans mon fichier batch, j'appelle le script PowerShell comme ceci :

powershell.exe "& "G:\Karan\PowerShell_Scripts\START_DEV.ps1"

Maintenant, je veux passer un paramètre de type chaîne de caractères à START_DEV.ps1 . Disons que le paramètre est w=Dev .

Comment puis-je le faire ?

1 votes

Le script attend-il un paramètre nommé ou un paramètre anonyme ?

149voto

empo Points 12803

Disons que vous souhaitez transmettre la chaîne de caractères Dev comme paramètre, à partir de votre fichier batch :

powershell -command "G:\Karan\PowerShell_Scripts\START_DEV.ps1 Dev"

mis dans votre script de powershell :

$w = $args[0]       # $w would be set to "Dev"

Ceci si vous voulez utiliser la variable intégrée $args . Autrement :

 powershell -command "G:\Karan\PowerShell_Scripts\START_DEV.ps1 -Environment \"Dev\""

et dans la tête de votre script powershell :

param([string]$Environment)

Ceci si vous voulez un paramètre nommé.

Vous pourriez également être intéressé par le retour du niveau d'erreur :

powershell -command "G:\Karan\PowerShell_Scripts\START_DEV.ps1 Dev; exit $LASTEXITCODE"

Le niveau d'erreur sera disponible dans le fichier batch sous la forme suivante %errorlevel% .

26voto

ravikanth Points 9573

En supposant que votre script est quelque chose comme le snippet ci-dessous et nommé testargs.ps1

param ([string]$w)
Write-Output $w

Vous pouvez l'appeler en ligne de commande comme suit :

PowerShell.Exe -File C:\scripts\testargs.ps1 "Test String"

Ceci imprimera "Test String" (sans guillemets) à la console. "Test String" devient la valeur de $w dans le script.

16voto

Goyuix Points 9634

Lorsqu'un script est chargé, tous les paramètres qui sont passés sont automatiquement chargés dans une variable spéciale. $args . Vous pouvez y faire référence dans votre script sans le déclarer au préalable.

À titre d'exemple, créez un fichier appelé test.ps1 et simplement avoir la variable $args sur une ligne à part. En invoquant le script comme ceci, on obtient la sortie suivante :

PowerShell.exe -File test.ps1 a b c "Easy as one, two, three"
a
b
c
Easy as one, two, three

En tant que recommandation générale, lorsque vous invoquez un script en appelant PowerShell directement, je suggérerais d'utiliser l'option -File plutôt que de l'invoquer implicitement avec l'option & - cela peut rendre la ligne de commande un peu plus propre, en particulier si vous devez gérer des guillemets imbriqués.

8voto

Hyundong Hwang Points 363

Ajouter la déclaration des paramètres en haut du fichier ps1

test.ps1

param(
  # Our preferred encoding
  [parameter(Mandatory=$false)]
  [ValidateSet("UTF8","Unicode","UTF7","ASCII","UTF32","BigEndianUnicode")]
  [string]$Encoding = "UTF8"
)

write ("Encoding : {0}" -f $Encoding)

Résultat

C:\temp> .\test.ps1 -Encoding ASCII
Encoding : ASCII

8voto

techsaint Points 621

La réponse de @Emiliano est excellente. Vous pouvez également passer des paramètres nommés comme ceci :

powershell.exe -Command 'G:\Karan\PowerShell_Scripts\START_DEV.ps1' -NamedParam1 "SomeDataA" -NamedParam2 "SomeData2"

Notez que les paramètres sont en dehors de l'appel de la commande, et que vous utiliserez :

[parameter(Mandatory=$false)]
  [string]$NamedParam1,
[parameter(Mandatory=$false)]
  [string]$NamedParam2

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X