Exécution d'un fichier EXE à l'aide d'un script PowerShell

111

J'essaie d'exécuter un fichier EXE à l'aide d'un script PowerShell. Si j'utilise la ligne de commande cela fonctionne sans problème (je fournis d'abord 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 renvoie 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 cmdlet, fonction , fichier de script ou programme utilisable. 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 appelé la commande en utilisant l'opérateur "&".)

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

Eden
la source
4
Postez votre code, s'il vous plaît. Puisque c'est là que réside le problème, il est beaucoup plus facile de l'examiner que de deviner.
Cody Gray

Réponses:

122
& "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 à l'aide de l'opérateur" & ")". J'ai eu ce problème lorsque j'évaluais le chemin de manière dynamique. 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"
Tomas Panik
la source
Bizarre que la commande dans la question d'origine, presque exactement, fonctionne pour moi sur une VM dans PS2.0. Mais cette même commande échoue maintenant sur le système PS4.0. Fait intéressant, j'appelle également TestExecute. Je pense que j'aime mieux l'option 2, je vais essayer, merci!
EJA
33

Il semble que vous spécifiez à la fois le fichier 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" <arguments go here>

Cela &s'attend à être suivi d'une chaîne qui identifie une commande: applet de commande, fonction, chemin d'accès relatif ou absolu exe natif.

Une fois que cela fonctionne:

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

Commencez à citer les arguments si nécessaire. Bien qu'il semble que vos arguments devraient être très bien (pas d'espaces, pas d'autres caractères spéciaux interprétés par PowerShell).

Keith Hill
la source
2
Est-il possible d'exécuter le script PowerShell sans le chemin complet, si le script et l'exe sont dans le même dossier? Ou est-il possible d'utiliser un chemin relatif?
guanome le
7
Si l'exe se trouve dans le même dossier, vous pouvez le faire .\foo.exeet vous pouvez également utiliser un chemin relatif ..\..\foo.exeet un chemin relatif avec des espaces & '..\..\path with spaces\foo.exe'.
Keith Hill
Lorsque vous avez des tuyaux dans votre commande que vous devez utiliser les guillemets cmd /c "C:\temp\strarc.exe -cjd:M:\ | C:\temp\strarc.exe -s:8 -xd:N:\".
larkee
2

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

cd C: \ Utilisateurs \ Administrateurs \ Téléchargements

PS C: \ Utilisateurs \ Administrateurs \ Téléchargements> & '. \ Aaa.exe'

Le programme d'installation apparaît et suivez les instructions à l'écran.

type au hasard
la source
exactement ce que je veux! exécutez un fichier .exe & '. \ aaa.exe'
Sharif Yazdian
2
  1. cloner $ args
  2. pousser vos arguments dans un nouveau tableau
  3. & $ chemin $ args

Démo:

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

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

& $exepath $myArgs
NoDocCat
la source
Thx @nodoccat, a fonctionné comme un charme pour lancer une commande docker avec une très longue liste d'arguments.
danidemi
1

N'étant pas développeur, j'ai trouvé une solution en exécutant plusieurs commandes ps en une seule ligne. Par exemple:

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

En plaçant un "(guillemets doubles) avant le & (esperluette), il exécute l'exécutable. Dans aucun des exemples que j'ai trouvé, cela n'a été mentionné. Sans les guillemets doubles, l'invite ps s'ouvre et attend l'entrée.

RichardE
la source
Salut RichardE. Pouvez-vous améliorer la mise en forme de votre réponse? En mode édition, une aide au formatage est fournie, jetez-y un œil.
Dorian Turba le