Przekaż parametr z pliku wsadowego do skryptu programu PowerShell

90

W moim pliku wsadowym wywołuję skrypt PowerShell w następujący sposób:

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

Teraz chcę przekazać parametr ciągu do START_DEV.ps1. Powiedzmy, że parametr to w=Dev.

Jak mogę to zrobić?

Karan
źródło
1
Czy skrypt oczekuje parametru nazwanego czy anonimowego?
vonPryz

Odpowiedzi:

142

Powiedzmy, że chcesz przekazać ciąg Devjako parametr z pliku wsadowego:

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

umieść wewnątrz głowy skryptu PowerShell:

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

Dzieje się tak, jeśli chcesz użyć zmiennej wbudowanej $args. Inaczej:

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

a wewnątrz głowy skryptu PowerShell:

param([string]$Environment)

Dzieje się tak, jeśli chcesz mieć nazwany parametr.

Możesz być także zainteresowany zwróceniem poziomu błędu:

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

Poziom błędu będzie dostępny w pliku wsadowym jako %errorlevel%.

Emiliano Poggi
źródło
24

Zakładając, że Twój skrypt jest podobny do poniższego fragmentu i nosi nazwę testargs.ps1

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

Możesz nazwać to w linii poleceń jako:

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

Spowoduje to wydrukowanie „Ciągu testowego” (bez cudzysłowów) na konsoli. „Ciąg testowy” staje się wartością $ w w skrypcie.

ravikanth
źródło
13

Po załadowaniu skryptu wszelkie przekazane parametry są automatycznie ładowane do specjalnych zmiennych $args . Możesz odwołać się do tego w swoim skrypcie bez uprzedniej deklaracji.

Na przykład utwórz plik o nazwie test.ps1i po prostu umieść zmienną $argsw osobnym wierszu. Wywołanie takiego skryptu powoduje wygenerowanie następującego wyniku:

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

Zgodnie z ogólną rekomendacją, podczas wywoływania skryptu przez bezpośrednie wywołanie programu PowerShell sugerowałbym użycie tej -Fileopcji zamiast niejawnego wywoływania go za pomocą &- może to spowodować, że wiersz poleceń będzie nieco czystszy, szczególnie jeśli chcesz poradzić sobie z zagnieżdżonymi cudzysłowami.

Goyuix
źródło
7

Dodaj deklarację parametru na początku pliku 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)

Wynik

C:\temp> .\test.ps1 -Encoding ASCII
Encoding : ASCII
Hyundong Hwang
źródło
6

Odpowiedź @Emiliano jest doskonała. Możesz również przekazać nazwane parametry, takie jak:

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

Zwróć uwagę, że parametry są poza wywołaniem polecenia, a użyjesz:

[parameter(Mandatory=$false)]
  [string]$NamedParam1,
[parameter(Mandatory=$false)]
  [string]$NamedParam2
techsaint
źródło