Passare il parametro da un file batch a uno script di PowerShell


88

Nel mio file batch, chiamo lo script PowerShell in questo modo:

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

Ora voglio passare un parametro stringa a START_DEV.ps1. Diciamo che il parametro è w=Dev.

Come posso fare questo?


1
Lo script prevede un parametro denominato o uno anonimo?
vonPryz

Risposte:


139

Diciamo che desideri passare la stringa Devcome parametro, dal tuo file batch:

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

inserisci la tua testina di script PowerShell:

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

Questo se vuoi usare la variabile incorporata $args. Altrimenti:

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

e all'interno della tua testina di script PowerShell:

param([string]$Environment)

Questo se vuoi un parametro con nome.

Potresti anche essere interessato a restituire il livello di errore:

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

Il livello di errore sarà disponibile all'interno del file batch come %errorlevel%.


23

Supponendo che lo script sia qualcosa di simile allo snippet di seguito e denominato testargs.ps1

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

Puoi chiamarlo dalla riga di comando come:

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

Questo stamperà "Stringa di prova" (senza virgolette) sulla console. "Stringa di prova" diventa il valore di $ w nello script.


13

Quando viene caricato uno script, tutti i parametri passati vengono automaticamente caricati in una variabile speciale $args. Puoi fare riferimento a questo nel tuo script senza prima dichiararlo.

Ad esempio, creare un file chiamato test.ps1e avere semplicemente la variabile $argssu una riga da sola. Invocando lo script in questo modo, viene generato il seguente output:

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

Come raccomandazione generale, quando si richiama uno script chiamando direttamente PowerShell, suggerirei di utilizzare l' -Fileopzione piuttosto che invocarla implicitamente con il &- può rendere la riga di comando un po 'più pulita, in particolare se è necessario gestire le virgolette nidificate.


7

Aggiungi la dichiarazione del parametro all'inizio del file 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)

Risultato

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

6

La risposta di @Emiliano è eccellente. Puoi anche passare parametri denominati in questo modo:

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

Nota che i parametri sono al di fuori della chiamata al comando e utilizzerai:

[parameter(Mandatory=$false)]
  [string]$NamedParam1,
[parameter(Mandatory=$false)]
  [string]$NamedParam2
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.