Передача параметра из пакетного файла в сценарий 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

Вы можете вызвать это в командной строке как:

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

Это напечатает "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параметр, а не неявно вызывать его с помощью &- он может сделать командную строку немного чище, особенно если вам нужно иметь дело с вложенными кавычками.

Goyuix
источник
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
техсэйнт
источник