Übergeben Sie Parameter aus einer Batchdatei an ein PowerShell-Skript

88

In meiner Batch-Datei rufe ich das PowerShell-Skript folgendermaßen auf:

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

Jetzt möchte ich einen String-Parameter an übergeben START_DEV.ps1. Angenommen, der Parameter ist w=Dev.

Wie kann ich das machen?

Karan
quelle
1
Erwartet das Skript einen benannten oder einen anonymen Parameter?
vonPryz

Antworten:

139

Angenommen, Sie möchten die Zeichenfolge Devals Parameter aus Ihrer Batchdatei übergeben:

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

Stecke es in deinen Powershell-Skriptkopf:

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

Dies ist der Fall, wenn Sie die integrierte Variable verwenden möchten $args. Andernfalls:

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

und in deinem Powershell-Skriptkopf:

param([string]$Environment)

Dies ist der Fall, wenn Sie einen benannten Parameter wünschen.

Möglicherweise möchten Sie auch die Fehlerstufe zurückgeben:

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

Die Fehlerstufe ist in der Batchdatei als verfügbar %errorlevel%.

Emiliano Poggi
quelle
23

Angenommen, Ihr Skript ist so etwas wie das folgende Snippet und heißt testargs.ps1

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

Sie können dies in der Befehlszeile wie folgt aufrufen:

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

Dadurch wird "Test String" (ohne Anführungszeichen) an der Konsole gedruckt. "Test String" wird zum Wert von $ w im Skript.

Ravikanth
quelle
12

Wenn ein Skript geladen wird, werden alle übergebenen Parameter automatisch in eine spezielle Variable geladen $args. Sie können dies in Ihrem Skript referenzieren, ohne es zuvor zu deklarieren.

Erstellen Sie beispielsweise eine aufgerufene Datei test.ps1und lassen Sie die Variable einfach $argsin einer eigenen Zeile stehen. Wenn Sie das Skript wie folgt aufrufen, wird die folgende Ausgabe generiert:

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

Als allgemeine Empfehlung würde ich beim Aufrufen eines Skripts durch direktes Aufrufen von PowerShell empfehlen, die -FileOption zu verwenden, anstatt sie implizit mit der Option aufzurufen. Dies &kann die Befehlszeile etwas übersichtlicher machen, insbesondere wenn Sie sich mit verschachtelten Anführungszeichen befassen müssen.

Goyuix
quelle
7

Fügen Sie die Parameterdeklaration oben in der ps1-Datei hinzu

test.ps1

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

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

Ergebnis

C:\temp> .\test.ps1 -Encoding ASCII
Encoding : ASCII
Hyundong Hwang
quelle
6

Die Antwort von @Emiliano ist ausgezeichnet. Sie können auch benannte Parameter wie folgt übergeben:

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

Beachten Sie, dass sich die Parameter außerhalb des Befehlsaufrufs befinden und Sie Folgendes verwenden:

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