ส่งผ่านพารามิเตอร์จากไฟล์แบตช์ไปยังสคริปต์ PowerShell


90

ในไฟล์แบตช์ของฉันฉันเรียกสคริปต์ PowerShell ดังนี้:

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

START_DEV.ps1ตอนนี้ผมต้องการที่จะผ่านพารามิเตอร์สตริง w=Devสมมติว่าพารามิเตอร์เป็น

ฉันจะทำเช่นนี้ได้อย่างไร?


1
สคริปต์คาดหวังพารามิเตอร์ที่มีชื่อหรือไม่ระบุชื่อหรือไม่
vonPryz

คำตอบ:


143

สมมติว่าคุณต้องการส่งสตริงDevเป็นพารามิเตอร์จากไฟล์แบตช์ของคุณ:

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

ใส่ไว้ในหัวสคริปต์ powershell ของคุณ:

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

$argsนี้ถ้าคุณต้องการที่จะใช้ในตัวตัวแปร มิฉะนั้น:

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

และภายในหัวสคริปต์ powershell ของคุณ:

param([string]$Environment)

หากคุณต้องการพารามิเตอร์ที่ตั้งชื่อ

คุณอาจสนใจที่จะคืนระดับข้อผิดพลาด:

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

%errorlevel%ระดับข้อผิดพลาดจะสามารถใช้ได้ภายในแฟ้มชุดเป็น


24

สมมติว่าสคริปต์ของคุณเป็นตัวอย่างด้านล่างและชื่อ testargs.ps1

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

คุณสามารถเรียกสิ่งนี้ได้ที่ commandline ว่า:

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

สิ่งนี้จะพิมพ์ "Test String" (โดยไม่มีเครื่องหมายคำพูด) ที่คอนโซล "สตริงทดสอบ" กลายเป็นค่า $ w ในสคริปต์


13

เมื่อสคริปต์จะโหลดพารามิเตอร์ใด ๆ $argsที่ส่งผ่านกำลังโหลดโดยอัตโนมัติเป็นตัวแปรพิเศษ คุณสามารถอ้างอิงสิ่งนั้นในสคริปต์ของคุณได้โดยไม่ต้องประกาศก่อน

ตัวอย่างเช่นสร้างไฟล์ที่เรียกว่าtest.ps1และมีตัวแปร$argsในบรรทัดด้วยตัวเอง การเรียกใช้สคริปต์เช่นนี้สร้างผลลัพธ์ต่อไปนี้:

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

ตามคำแนะนำทั่วไปเมื่อเรียกใช้สคริปต์โดยเรียกใช้ PowerShell โดยตรงฉันขอแนะนำให้ใช้-Fileตัวเลือกนี้แทนที่จะเรียกใช้โดยปริยายด้วยคำแนะนำ&- มันสามารถทำให้บรรทัดคำสั่งสะอาดขึ้นเล็กน้อยโดยเฉพาะอย่างยิ่งหากคุณต้องการจัดการกับเครื่องหมายคำพูดที่ซ้อนกัน


7

เพิ่มการประกาศพารามิเตอร์ที่ด้านบนของไฟล์ 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)

ผลลัพธ์

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

6

คำตอบจาก @Emiliano นั้นยอดเยี่ยมมาก คุณยังสามารถส่งผ่านพารามิเตอร์ที่ตั้งชื่อได้เช่นนี้:

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

สังเกตว่าพารามิเตอร์อยู่นอกการเรียกคำสั่งและคุณจะใช้:

[parameter(Mandatory=$false)]
  [string]$NamedParam1,
[parameter(Mandatory=$false)]
  [string]$NamedParam2
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.