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ć?
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ć?
Odpowiedzi:
Powiedzmy, że chcesz przekazać ciąg Dev
jako 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%
.
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.
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.ps1
i po prostu umieść zmienną $args
w 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 -File
opcji 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.
Dodaj deklarację parametru na początku pliku ps1
param(
# Our preferred encoding
[parameter(Mandatory=$false)]
[ValidateSet("UTF8","Unicode","UTF7","ASCII","UTF32","BigEndianUnicode")]
[string]$Encoding = "UTF8"
)
write ("Encoding : {0}" -f $Encoding)
C:\temp> .\test.ps1 -Encoding ASCII
Encoding : ASCII
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