Передайте параметр з командного файлу в сценарій PowerShell


90

У своєму командному файлі я називаю сценарій PowerShell таким чином:

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

Тепер я хочу передати параметр рядка в START_DEV.ps1. Скажімо, параметр є w=Dev.

Як я можу це зробити?


1
Чи передбачає сценарій іменований параметр чи анонімний?
vonPryz

Відповіді:


142

Скажімо, ви хотіли б передати рядок 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

Ви можете викликати це в командному рядку як:

PowerShell.Exe -File C:\scripts\testargs.ps1 "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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.