Bir toplu iş dosyasından bir PowerShell betiğine parametre geçirme


90

Toplu iş dosyamda, PowerShell betiğini şu şekilde çağırıyorum:

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

Şimdi, bir dize parametresi geçirmek istiyorum START_DEV.ps1. Diyelim ki parametre w=Dev.

Bunu nasıl yapabilirim?


1
Komut dosyası adlandırılmış parametre mi yoksa anonim bir parametre mi bekliyor?
vonPryz

Yanıtlar:


143

Dize Dev, toplu iş dosyanızdan bir parametre olarak iletmek istediğinizi varsayalım :

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

powershell script başlığınızın içine koyun:

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

Bu, yerleşik değişkeni kullanmak istiyorsanız $args. Aksi takdirde:

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

ve powershell komut dosyası kafanızın içinde:

param([string]$Environment)

Bu, adlandırılmış bir parametre istiyorsanız.

Hata düzeyini döndürmek de ilginizi çekebilir:

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

Hata düzeyi, toplu iş dosyasında şu şekilde bulunacaktır %errorlevel%.


24

Komut dosyanızın aşağıdaki kod parçacığı gibi olduğunu ve testargs.ps1 olarak adlandırıldığını varsayarsak

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

Bunu komut satırında şu şekilde çağırabilirsiniz:

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

Bu, konsolda "Test Dizesi" (tırnak işaretleri olmadan) yazdıracaktır. "Test Dizesi", koddaki $ w'nin değeri olur.


13

Bir komut dosyası yüklendiğinde, aktarılan tüm parametreler otomatik olarak özel değişkenlere yüklenir $args. İlk önce bildirmeden komut dosyanızda buna başvurabilirsiniz.

Örnek olarak, adlı bir dosya oluşturun test.ps1ve değişkeni $argsbir satırda tek başına bulundurun. Betiği bu şekilde çağırmak aşağıdaki çıktıyı üretir:

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

Genel bir öneri olarak, PowerShell'i doğrudan çağırarak bir betiği çağırırken, -Fileseçeneğiyle örtük olarak çağırmak yerine seçeneğin kullanılmasını öneririm &- özellikle iç içe geçmiş tırnaklarla uğraşmanız gerekiyorsa komut satırını biraz daha temiz hale getirebilir.


7

Ps1 dosyasının en üstüne parametre bildirimini ekleyin

test.ps1

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

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

Sonuç

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

6

@Emiliano'nun cevabı mükemmel. Ayrıca aşağıdaki gibi adlandırılmış parametreleri de iletebilirsiniz:

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

Parametrelerin komut çağrısının dışında olduğunu ve şunları kullanacağınızı unutmayın:

[parameter(Mandatory=$false)]
  [string]$NamedParam1,
[parameter(Mandatory=$false)]
  [string]$NamedParam2
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.