Durante años, he utilizado el intérprete de comandos cmd/DOS/Windows
y he pasado argumentos de línea de comandos a archivos por lotes. Por ejemplo, tengo un archivo, zuzu.bat
y en él, accedo a %1
, %2
, etc. Ahora, quiero hacer lo mismo cuando llamo a un script PowerShell
cuando estoy en un shell Cmd.exe
. Tengo un script, xuxu.ps1
(y he añadido PS1 a mi variable PATHEXT y asociado archivos PS1 con PowerShell). Pero haga lo que haga, no consigo obtener nada de la variable $args
. Siempre tiene longitud 0.
Si estoy en un shell PowerShell
, en lugar de cmd.exe
, funciona (por supuesto). Pero todavía no me siento lo suficientemente cómodo como para vivir en el entorno PowerShell a tiempo completo. No quiero escribir powershell.exe -command xuxu.ps1 p1 p2 p3 p4
. Quiero escribir xuxu p1 p2 p3 p4
.
¿Es esto posible, y si es así, cómo?
El ejemplo que no consigo que funcione 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>
OK, así que en primer lugar esto es romper una característica básica de seguridad en PowerShell. Con ese entendimiento, aquí es cómo usted puede hacerlo:
Es posible que desee poner un argumento -NoProfile
allí también dependiendo de lo que hace su perfil.
Tal vez usted puede envolver la invocación PowerShell en un archivo .bat
así:
rem ps.bat
@echo off
powershell.exe -command "%*"
Si a continuación, coloca este archivo en una carpeta de su PATH
, podría llamar a los scripts de PowerShell como este:
ps foo 1 2 3
Citar puede ser un poco desordenado, sin embargo:
ps write-host """hello from cmd!""" -foregroundcolor green
Usted no puede obtener "xuxu p1 p2 p3 p4" como parece. Pero cuando estás en PowerShell y pones
PS > set-executionpolicy Unrestricted -scope currentuser
Puedes ejecutar esos scripts así:
./xuxu p1 p2 p3 p4
o
.\xuxu p1 p2 p3 p4
o
./xuxu.ps1 p1 p2 p3 p4
Espero que esto te haga sentir un poco más cómodo con PowerShell.