Passer le paramètre d'un fichier de commandes à un script PowerShell

88

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

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

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

Comment puis-je faire ceci?

Karan
la source
1
Le script attend-il un paramètre nommé ou un paramètre anonyme?
vonPryz

Réponses:

139

Disons que vous souhaitez passer la chaîne en Devtant que paramètre, à partir de votre fichier batch:

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

mettez dans votre tête de script PowerShell:

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

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

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

et à l'intérieur de votre tête de script PowerShell:

param([string]$Environment)

Ceci si vous voulez un paramètre nommé.

Vous pourriez également être intéressé par le renvoi 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 de commandes sous la forme %errorlevel%.

Emiliano Poggi
la source
23

En supposant que votre script est quelque chose comme l'extrait ci-dessous et nommé testargs.ps1

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

Vous pouvez appeler cela sur la ligne de commande comme suit:

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

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

ravikanth
la source
13

Lorsqu'un script est chargé, tous les paramètres transmis sont automatiquement chargés dans des variables spéciales $args. Vous pouvez référencer cela dans votre script sans le déclarer au préalable.

Par exemple, créez un fichier appelé test.ps1et placez simplement la variable $argssur une ligne seule. L'appel du script comme celui-ci génère 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 règle générale, lors de l'appel d'un script en appelant directement PowerShell, je suggérerais d'utiliser l' -Fileoption plutôt que de l'invoquer implicitement avec le &- cela peut rendre la ligne de commande un peu plus propre, en particulier si vous devez gérer des guillemets imbriqués.

Goyuix
la source
7

Ajoutez la déclaration de paramètre 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
Hyundong Hwang
la source
6

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 commande et que vous utiliserez:

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