Passe o parâmetro de um arquivo em lote para um script PowerShell

88

Em meu arquivo em lote, chamo o script do PowerShell assim:

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

Agora, quero passar um parâmetro de string para START_DEV.ps1. Digamos que o parâmetro seja w=Dev.

Como posso fazer isso?

Karan
fonte
1
O script espera um parâmetro nomeado ou anônimo?
vonPryz de

Respostas:

139

Digamos que você gostaria de passar a string Devcomo um parâmetro, de seu arquivo em lote:

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

coloque dentro da sua cabeça de script PowerShell:

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

Isso se você quiser usar a variável embutida $args. De outra forma:

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

e dentro de sua cabeça de script PowerShell:

param([string]$Environment)

Isso se você quiser um parâmetro nomeado.

Você também pode estar interessado em retornar o nível de erro:

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

O nível de erro estará disponível dentro do arquivo em lote como %errorlevel%.

Emiliano Poggi
fonte
23

Supondo que seu script seja algo como o snippet abaixo e chamado testargs.ps1

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

Você pode chamar isso na linha de comando como:

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

Isso imprimirá "String de teste" (sem aspas) no console. "String de teste" torna-se o valor de $ w no script.

Ravikanth
fonte
13

Quando um script é carregado, todos os parâmetros passados ​​são carregados automaticamente em variáveis ​​especiais $args. Você pode fazer referência a isso em seu script sem primeiro declarar.

Como exemplo, crie um arquivo chamado test.ps1e simplesmente coloque a variável $argsem uma linha sozinha. Invocar o script desta forma, gera a seguinte saída:

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

Como recomendação geral, ao invocar um script chamando o PowerShell diretamente, eu sugeriria usar a -Fileopção em vez de invocá-la implicitamente com &- ela pode tornar a linha de comando um pouco mais limpa, especialmente se você precisar lidar com aspas aninhadas.

Goyuix
fonte
7

Adicione a declaração do parâmetro no topo do arquivo 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)

Resultado

C:\temp> .\test.ps1 -Encoding ASCII
Encoding : ASCII
Hyundong Hwang
fonte
6

A resposta da @Emiliano é excelente. Você também pode passar parâmetros nomeados como:

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

Observe que os parâmetros estão fora da chamada de comando e você usará:

[parameter(Mandatory=$false)]
  [string]$NamedParam1,
[parameter(Mandatory=$false)]
  [string]$NamedParam2
techsaint
fonte