Pregunta Cómo pasar argumentos de línea de comandos a un archivo PowerShell ps1


Durante años, he usado el cmd/DOS/Windows shell y pasó los argumentos de la línea de comandos a los archivos por lotes. Por ejemplo, tengo un archivo, zuzu.bat y en él, tengo acceso %1, %2, etc. Ahora, quiero hacer lo mismo cuando llamo a un PowerShell guión when I am in a Cmd.exe shell. Tengo un guion, xuxu.ps1 (y agregué PS1 a mi variable PATHEXT y archivos PS1 asociados con PowerShell). Pero no importa lo que haga, parece que no puedo obtener nada de la $args variable. Siempre tiene longitud 0.

Si estoy en una PowerShell shell, en lugar de cmd.exe, funciona (por supuesto) Pero todavía no me siento lo suficientemente cómodo para vivir en el entorno de PowerShell a tiempo completo. No quiero escribir powershell.exe -command xuxu.ps1 p1 p2 p3 p4. Quiero escribir xuxu p1 p2 p3 p4.

¿Es posible? y si lo es, cómo?

La muestra que no puedo ponerme a trabajar es trivial, foo.ps1:

Write-Host "Num Args:" $args.Length;
foreach ($arg in $args) {
    Write-Host "Arg: $arg";
}

Los resultados son siempre así:

C:\temp> foo
Num Args: 0
C:\temp> foo a b c d
Num Args: 0
c:\temp>

76
2017-08-18 13:37


origen


Respuestas:


Este artículo ayuda En particular, esta sección:

-Archivo

Ejecuta el script especificado en el ámbito local ("dot-sourced"), de modo que las funciones y variables que crea el script estén disponibles en la sesión actual. Ingrese la ruta del archivo de script y cualquier parámetro. El archivo debe ser el último parámetro del comando, ya que todos los caracteres que se escriben después del nombre del parámetro Archivo se interpretan como la ruta del archivo de script seguida de los parámetros del script.

es decir

powershell.exe -File "C:\myfile.ps1" arg1 arg2 arg3

significa ejecutar el archivo myfile.ps1 y arg1 arg2 y arg3 son los parámetros para el script de PowerShell.


27
2018-03-28 00:35



OK, entonces esto es romper una característica de seguridad básica en PowerShell. Con ese entendimiento, aquí es cómo puedes hacerlo:

  1. Abra un Explorador de Windows ventana
  2. Menú Herramientas -> Opciones de carpeta -> pestaña Tipos de archivo
  3. Encuentre el tipo de archivo PS1 y haga clic en el botón avanzado
  4. Haga clic en el botón Nuevo
  5. Para la acción puesta: Abierto
  6. Para la aplicación puesta: "C: \ WINNT \ system32 \ WindowsPowerShell \ v1.0 \ powershell.exe" "-file" "% 1"% *

Es posible que desee poner un -NoProfile argumento también allí dependiendo de lo que hace tu perfil.


16
2017-08-18 14:10



Después de buscar en la documentación de PowerShell, descubrí información útil sobre este tema. No puedes usar el $args si usaste el param(...) al comienzo de tu archivo; en cambio, necesitarás usar $PSBoundParameters. Copié / pegué su código en un script de PowerShell, y funcionó como esperaba en la versión 2 de PowerShell (no estoy seguro de la versión en la que estaba cuando se encontró con este problema).

Si estás usando $PSBoundParameters (y esto SÓLO funciona si estás usando param(...) al comienzo de su secuencia de comandos), entonces no es una matriz, es una tabla hash, por lo que tendrá que hacer referencia a ella utilizando la pareja clave / valor.

param($p1, $p2, $p3, $p4)
$Script:args=""
write-host "Num Args: " $PSBoundParameters.Keys.Count
foreach ($key in $PSBoundParameters.keys) {
    $Script:args+= "`$$key=" + $PSBoundParameters["$key"] + "  "
}
write-host $Script:args

Y cuando se llama con ...

PS> ./foo.ps1 a b c d

El resultado es...

Num Args:  4
$p1=a  $p2=b  $p3=c  $p4=d

13
2017-07-25 21:24



Declara tus parámetros en el archivo, como param ([string] $ para1 ....... [string] $ param2).

Ahora llame al archivo de PowerShell como temp.ps1 para1 para2....para10, etc.


8
2017-08-24 11:41



Quizás pueda envolver la invocación de PowerShell en un .batarchivo como tal:

rem ps.bat
@echo off
powershell.exe -command "%*"

Si luego colocó este archivo debajo de una carpeta en su PATH, puedes llamar a los scripts de PowerShell de la siguiente manera:

ps foo 1 2 3

Citar puede ser un poco complicado, sin embargo:

ps write-host """hello from cmd!""" -foregroundcolor green

6
2018-01-21 00:19



Es posible que no obtenga "xuxu p1 p2 p3 p4" como parece. Pero cuando estás en PowerShell y estableces

PS > set-executionpolicy Unrestricted -scope currentuser

Puede ejecutar esos scripts de esta manera:

./xuxu p1 p2 p3 p4

o

.\xuxu p1 p2 p3 p4

o

./xuxu.ps1 p1 p2 p3 p4

Espero que eso te haga sentir un poco más cómodo con PowerShell.


1
2018-05-27 18:41