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

В моем командном файле я вызываю сценарий PowerShell следующим образом:

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

Теперь я хочу передать строковый параметр START_DEV.ps1. Пусть говорят, что параметр w=Dev.

Как я могу это сделать?

Ответ 1

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

и внутри вашей скриптовой головы:

$w=$args[0]

Это если вы хотите использовать встроенную переменную $args. Иначе:

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

и внутри вашей скриптовой головы:

param([string]$Environment)

Это если вы хотите именованный параметр.

Вы также можете быть заинтересованы в возврате уровня ошибки:

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

Уровень ошибок будет доступен внутри командного файла как %errorlevel%.

Ответ 2

Предполагая, что ваш script является чем-то вроде приведенного ниже фрагмента и назван testargs.ps1

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

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

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

При этом на консоли будет напечатано "Test String" (без кавычек). "Test String" становится значением $w в script.

Ответ 3

При загрузке script любые передаваемые параметры автоматически загружаются в специальные переменные $args. Вы можете ссылаться на это в своем script, не объявив сначала.

В качестве примера создайте файл с именем test.ps1 и просто получим переменную $args в строке. Вызов script следующим образом:

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

Как общая рекомендация при вызове script путем прямого вызова PowerShell я бы предложил использовать опцию -File вместо того, чтобы неявно вызвать его с помощью & - он может сделать командную строку немного более чистым, особенно если вам нужно иметь дело с вложенными кавычками.

Ответ 4

Добавьте объявление параметра в начало файла 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

Ответ 5

Ответ от @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