Pregunta Pase el parámetro del archivo por lotes al script powershell


En mi archivo de proceso 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?


74
2018-06-15 14:46


origen


Respuestas:


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

y dentro de la cabeza del script:

$w=$args[0]

Esto si quieres usar la variable incorporada $args. De otra manera:

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

y dentro de la cabeza del script:

param([string]$w)

Esto si quieres un parámetro con nombre.

También podría 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%.


113
2018-06-15 18:19



Suponiendo que su script es algo así como el fragmento de abajo y se llama testargs.ps1

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

Puede llamar esto a la línea de comando como:

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

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


17
2018-06-15 15:35



Cuando se carga una secuencia de comandos, los parámetros que se pasan se cargan automáticamente en una variable especial $args. Puedes hacer referencia a eso en tu script sin declararlo primero.

Como ejemplo, crea un archivo llamado test.ps1 y simplemente tener la variable $args en una línea por sí mismo. Invocar el script de esta manera 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, cuando invoco un script llamando directamente a PowerShell, sugiero que use el -File opción en lugar de invocando 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.


9
2018-06-15 15:21



Agregue la declaración de param 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

3
2017-11-07 00:34



La respuesta de @Emiliano es excelente. También puede pasar los parámetros nombrados de la siguiente manera:

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 usará:

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

0
2018-05-03 19:23