156 votes

Exécuter un fichier EXE en utilisant un script PowerShell

Je essaie d'exécuter un fichier EXE en utilisant un script PowerShell. Si j'utilise la ligne de commande, cela fonctionne sans problème (d'abord je fournis le nom de l'exécutable et une série de paramètres pour l'invoquer):

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

Mais faire exactement la même chose à l'intérieur d'un script retourne une erreur:

Le terme '"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode' n'est pas reconnu comme le nom d'une commande, fonction, fichier de script ou programme exécutable. Vérifiez l'orthographe du nom, ou si un chemin a été inclus, vérifiez que le chemin est correct et réessayez.

(J'ai invoqué la commande en utilisant l'opérateur "&".)

Comment puis-je résoudre ce problème?

5 votes

Publiez votre code, s'il vous plaît. Puisque c'est là que se situe le problème, il est beaucoup plus facile de le regarder que de deviner.

170voto

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

ou

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

MISE À JOUR : Désolé, j'ai manqué la phrase "(J'ai invoqué la commande en utilisant l'opérateur "&")". J'ai eu ce problème lorsque j'évaluais le chemin dynamiquement. Essayez la construction Invoke-Expression :

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

0 votes

Il est étrange que la commande de la question initiale fonctionne presque exactement pour moi sur une machine virtuelle en PS2.0. Mais cette même commande échoue maintenant sur un système PS4.0. Curieusement, je suis également en train d'appeler TestExecute. Je pense que j'opte pour la deuxième option, je vais essayer ça, merci !

52voto

Keith Hill Points 73162

Il semble que vous spécifiez à la fois le EXE et son premier argument dans une seule chaîne, par exemple; '"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode'. Cela ne fonctionnera pas. En général, vous invoquez une commande native qui a un espace dans son chemin comme ceci:

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

C'est que & s'attend à être suivi d'une chaîne qui identifie une commande: cmdlet, fonction, exe natif avec chemin relatif ou absolu.

Une fois que vous avez cela qui fonctionne :

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

Commencez à travailler sur la mise entre guillemets des arguments si nécessaire. Bien que vos arguments semblent être très bien (pas d'espaces, pas d'autres caractères spéciaux interprétés par PowerShell).

3 votes

Y a-t-il un moyen d'exécuter le script powershell sans le chemin complet, si le script et l'exécutable se trouvent dans le même dossier? Ou est-il possible d'utiliser un chemin relatif?

9 votes

Si l'exécutable se trouve dans le même dossier, vous pouvez faire ceci .\foo.exe et vous pouvez également utiliser un chemin relatif ..\..\foo.exe et un chemin relatif avec des espaces & '..\..\chemin avec des espaces\foo.exe'.

0 votes

Lorsque vous avez des tuyaux dans votre commande, vous devez utiliser des guillemets : cmd /c "C:\temp\strarc.exe -cjd:M:\ | C:\temp\strarc.exe -s:8 -xd:N:\".

5voto

randomguy Points 66

Dans Powershell, accédez à l'emplacement du fichier .exe. Par exemple:

cd C:\Users\Administrators\Downloads

PS C:\Users\Administrators\Downloads> & '.\aaa.exe'

L'installateur s'affiche, suivez les instructions à l'écran.

0 votes

Exactement ce que je veux! exécuter un fichier .exe & '.\aaa.exe'

0 votes

./aaa.exe fonctionne pour moi.

3voto

NoDocCat Points 31
  1. cloner $args
  2. ajouter vos arguments dans un nouveau tableau
  3. & $chemin $args

Démonstration:

$cheminExe = $env:NGINX_HOME + '/nginx.exe'
$mesArgs = $args.Clone()

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

& $cheminExe $mesArgs

0 votes

Merci @nodoccat, ça a marché parfaitement pour lancer une commande docker avec une liste d'arguments très longue.

2voto

ajhino Points 91

Voici une variation de certaines des réponses précédentes. L'une des options ci-dessous peut être ajoutée à un profil Powershell pour répondre à vos besoins.

Utiliser un alias

Si vous voulez simplement exécuter quelque chose sans perturber $env:PATH.

Set-Alias -Name docker -Value 'C:\Program Files\Docker\Docker\resources\bin\docker.exe'

Utiliser une fonction

Ou si vous avez besoin de plus de scripting.

function docker {
# ci-dessous est un exemple de base - laissez libre cours à votre imagination ici
& 'C:\Program Files\Docker\Docker\resources\bin\docker.exe' @Args
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X