Pasar el parámetro de un archivo por lotes a un script de PowerShell

90

En mi archivo por lotes, llamo al script de PowerShell así:

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

Ahora, quiero pasar un parámetro de cadena a START_DEV.ps1. Digamos que el parámetro es w=Dev.

¿Cómo puedo hacer esto?

Karan
fuente
1
¿El script espera un parámetro con nombre o uno anónimo?
vonPryz

Respuestas:

142

Digamos que le gustaría pasar la cadena Devcomo un parámetro, desde su archivo por lotes:

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

poner dentro de su cabeza de script de powershell:

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

Esto si desea utilizar la variable incorporada $args. De otra manera:

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

y dentro de la cabeza del script de powershell:

param([string]$Environment)

Esto si desea un parámetro con nombre.

También puede estar interesado en devolver el nivel de error:

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

El nivel de error estará disponible dentro del archivo por lotes como %errorlevel%.

Emiliano Poggi
fuente
24

Suponiendo que su secuencia de comandos es algo como el siguiente fragmento y se llama testargs.ps1

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

Puede llamar a esto en la línea de comandos como:

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

Esto imprimirá "Test String" (sin comillas) en la consola. "Test String" se convierte en el valor de $ w en el script.

ravikanth
fuente
13

Cuando se carga un script, los parámetros que se pasan se cargan automáticamente en variables especiales $args. Puede hacer referencia a eso en su secuencia de comandos sin antes declararlo.

Como ejemplo, cree un archivo llamado test.ps1y simplemente tenga la variable $argsen una línea por sí misma. Al invocar el script de esta manera, se genera el siguiente resultado:

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

Como recomendación general, al invocar un script llamando a PowerShell directamente, sugeriría usar la -Fileopción en lugar de invocarla implícitamente con el &- puede hacer que la línea de comando sea un poco más limpia, particularmente si necesita lidiar con comillas anidadas.

Goyuix
fuente
7

Agregue la declaración de parámetros en la parte superior del archivo 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
fuente
6

La respuesta de @Emiliano es excelente. También puede pasar parámetros con nombre así:

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

Tenga en cuenta que los parámetros están fuera de la llamada de comando y utilizará:

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