Ejecutar un archivo EXE usando un script de PowerShell

111

Estoy intentando ejecutar un archivo EXE usando un script de PowerShell. Si utilizo la línea de comandos funciona sin problemas (primero proporciono el nombre del ejecutable y la serie de parámetros para invocarlo):

"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode

Pero hacer exactamente lo mismo dentro de un script devuelve un error:

El término '"C: \ Archivos de programa \ Automated QA \ TestExecute 8 \ Bin \ TestExecute.exe" C: \ temp \ TestProject1 \ TestProject1.pjs / run / exit / SilentMode' no se reconoce como el nombre de un cmdlet, función , archivo de script o programa operable. Verifique la ortografía del nombre o, si se incluyó una ruta, verifique que la ruta sea correcta y vuelva a intentarlo.

(Invoqué el comando usando el operador "&").

¿Como puedo solucionar este problema?

Edén
fuente
4
Publique su código, por favor. Dado que ahí es donde radica el problema, tenerlo para mirar es mucho más fácil que adivinar.
Cody Gray

Respuestas:

122
& "C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode

o

[System.Diagnostics.Process]::Start("C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe", "C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode")

ACTUALIZACIÓN: lo siento, me perdí "(invoqué el comando usando el operador" & ")" oración. Tuve este problema cuando estaba evaluando la ruta de forma dinámica. Prueba la construcción Invoke-Expression:

Invoke-Expression "& `"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe`" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode"
Tomas Panik
fuente
Es extraño que el comando en la pregunta original, casi exactamente, funcione para mí en una máquina virtual en PS2.0. Pero ese mismo comando ahora falla en el sistema PS4.0. Curiosamente, también estoy llamando a TestExecute. Creo que lo que más me gusta es la opción 2, lo intentaré, ¡gracias!
EJA
33

Parece que está especificando tanto el EXE como su primer argumento en una sola cadena, por ejemplo; '"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode'. Esto no funcionará. En general, invoca un comando nativo que tiene un espacio en su ruta así:

& "c:\some path with spaces\foo.exe" <arguments go here>

Se &espera que sea seguida por una cadena que identifica un comando: cmdlet, función, ruta absoluta o relativa de exe nativo.

Una vez que consigas que esto funcione:

& "c:\some path with spaces\foo.exe"

Empiece a trabajar en la cita de los argumentos según sea necesario. Aunque parece que sus argumentos deberían estar bien (sin espacios, sin otros caracteres especiales interpretados por PowerShell).

Keith Hill
fuente
2
¿Hay alguna forma de ejecutar el script de PowerShell sin la ruta completa, si el script y el exe están en la misma carpeta? ¿O es posible utilizar una ruta relativa?
guanome
7
Si el archivo ejecutable está en la misma carpeta, entonces puede hacer esto .\foo.exey también puede usar una ruta relativa ..\..\foo.exey una ruta relativa con espacios & '..\..\path with spaces\foo.exe'.
Keith Hill
Cuando se tiene tubos en su comando del que debiera usar comillas: cmd /c "C:\temp\strarc.exe -cjd:M:\ | C:\temp\strarc.exe -s:8 -xd:N:\".
larkee
2

En Powershell, cd a la ubicación del archivo .exe. Por ejemplo:

cd C: \ Usuarios \ Administradores \ Descargas

PS C: \ Usuarios \ Administradores \ Descargas> & '. \ Aaa.exe'

El instalador aparece y sigue las instrucciones en la pantalla.

chico al azar
fuente
exactamente lo que quiero! ejecutar un archivo .exe & '. \ aaa.exe'
Sharif Yazdian
2
  1. clon $ args
  2. empuja tus argumentos en una nueva matriz
  3. & $ path $ args

Manifestación:

$exePath = $env:NGINX_HOME + '/nginx.exe'
$myArgs = $args.Clone()

$myArgs += '-p'
$myArgs += $env:NGINX_HOME

& $exepath $myArgs
NoDocCat
fuente
Thx @nodoccat, funcionó como un encanto para lanzar un comando de Docker con una lista muy larga de argumentos.
danidemi
1

Al no ser desarrollador, encontré una solución al ejecutar varios comandos ps en una línea. P.ej:

powershell "& 'c:\path with spaces\to\executable.exe' -arguments ; second command ; etc

Al colocar un "(comillas dobles) antes del & (ampersand), se ejecuta el ejecutable. En ninguno de los ejemplos he encontrado que esto se haya mencionado. Sin las comillas dobles, el indicador ps se abre y espera la entrada.

RichardE
fuente
Hola RichardE. ¿Puedes mejorar el formato de tu respuesta? En el modo de edición, se proporciona ayuda de formato, échale un vistazo.
Dorian Turba