Meneruskan parameter dari file batch ke skrip PowerShell


90

Di file batch saya, saya memanggil skrip PowerShell seperti ini:

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

Sekarang, saya ingin meneruskan parameter string ke START_DEV.ps1. Misalkan parameternya adalah w=Dev.

Bagaimana saya bisa melakukan ini?


1
Apakah skrip mengharapkan parameter bernama atau yang anonim?
vonPryz

Jawaban:


142

Katakanlah Anda ingin meneruskan string Devsebagai parameter, dari file batch Anda:

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

masukkan ke dalam kepala skrip PowerShell Anda:

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

Ini jika Anda ingin menggunakan variabel built-in $args. Jika tidak:

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

dan di dalam kepala skrip PowerShell Anda:

param([string]$Environment)

Ini jika Anda menginginkan parameter bernama.

Anda mungkin juga tertarik untuk mengembalikan tingkat kesalahan:

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

Tingkat kesalahan akan tersedia di dalam file batch sebagai %errorlevel%.


24

Dengan asumsi skrip Anda adalah sesuatu seperti cuplikan di bawah ini dan bernama testargs.ps1

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

Anda dapat memanggil ini di baris perintah sebagai:

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

Ini akan mencetak "Test String" (tanpa tanda kutip) di konsol. "Test String" menjadi nilai $ w dalam skrip.


13

Saat skrip dimuat, parameter apa pun yang diteruskan secara otomatis dimuat ke dalam variabel khusus $args. Anda dapat mereferensikannya di skrip Anda tanpa mendeklarasikannya terlebih dahulu.

Sebagai contoh, buat file bernama test.ps1dan cukup buat variabel $argsdi baris itu sendiri. Memanggil skrip seperti ini, menghasilkan keluaran berikut:

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

Sebagai rekomendasi umum, saat menjalankan skrip dengan memanggil PowerShell secara langsung, saya akan menyarankan untuk menggunakan -Fileopsi daripada secara implisit menjalankannya dengan &- ini dapat membuat baris perintah sedikit lebih bersih, terutama jika Anda perlu berurusan dengan kutipan bertingkat.


7

Tambahkan deklarasi parameter di bagian atas 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)

Hasil

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

6

Jawaban dari @Emiliano luar biasa. Anda juga dapat mengirimkan parameter bernama seperti:

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

Perhatikan bahwa parameter berada di luar panggilan perintah, dan Anda akan menggunakan:

[parameter(Mandatory=$false)]
  [string]$NamedParam1,
[parameter(Mandatory=$false)]
  [string]$NamedParam2
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.