Ausführen einer EXE-Datei mithilfe eines PowerShell-Skripts

111

Ich versuche, eine EXE-Datei mit einem PowerShell-Skript auszuführen. Wenn ich die Befehlszeile verwende, funktioniert dies problemlos (zuerst gebe ich den Namen der ausführbaren Datei und eine Reihe von Parametern an, um sie aufzurufen):

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

Wenn Sie jedoch genau dasselbe in einem Skript tun, wird ein Fehler zurückgegeben:

Der Begriff "C: \ Programme \ Automatisierte Qualitätssicherung \ TestExecute 8 \ Bin \ TestExecute.exe" C: \ temp \ TestProject1 \ TestProject1.pjs / run / exit / SilentMode ' wird nicht als Name einer Cmdlet-Funktion erkannt , Skriptdatei oder bedienbares Programm. Überprüfen Sie die Schreibweise des Namens. Wenn ein Pfad enthalten war, überprüfen Sie, ob der Pfad korrekt ist, und versuchen Sie es erneut.

(Ich habe den Befehl mit dem Operator "&" aufgerufen.)

Wie kann ich dieses Problem beheben?

Eden
quelle
4
Bitte geben Sie Ihren Code ein. Da hier das Problem liegt, ist es viel einfacher, es sich anzusehen, als es zu erraten.
Cody Gray

Antworten:

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

oder

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

UPDATE: Entschuldigung, ich habe den Satz "(Ich habe den Befehl mit dem Operator" & "aufgerufen)" verpasst. Ich hatte dieses Problem, als ich den Pfad dynamisch auswertete. Versuchen Sie die Invoke-Expression-Konstruktion:

Invoke-Expression "& `"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe`" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode"
Tomas Panik
quelle
Seltsam, dass der Befehl in der ursprünglichen Frage fast genau für mich auf einer VM in PS2.0 funktioniert. Der gleiche Befehl schlägt jetzt auf dem PS4.0-System fehl. Interessanterweise rufe ich auch TestExecute an. Ich denke, ich mag Option 2 am liebsten, ich werde es versuchen, danke!
EJA
33

Es sieht so aus, als würden Sie sowohl die EXE-Datei als auch das erste Argument in einer einzelnen Zeichenfolge angeben, z. '"C:\Program Files\Automated QA\TestExecute 8\Bin\TestExecute.exe" C:\temp\TestProject1\TestProject1.pjs /run /exit /SilentMode'. Das wird nicht funktionieren. Im Allgemeinen rufen Sie einen nativen Befehl auf, dessen Pfad ein Leerzeichen enthält:

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

Es wird &erwartet, dass eine Zeichenfolge folgt, die einen Befehl identifiziert: Cmdlet, Funktion, nativer exer relativer oder absoluter Pfad.

Sobald Sie genau das zum Laufen gebracht haben:

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

Beginnen Sie bei Bedarf mit dem Zitieren der Argumente. Obwohl es so aussieht, als ob Ihre Argumente in Ordnung sein sollten (keine Leerzeichen, keine anderen von PowerShell interpretierten Sonderzeichen).

Keith Hill
quelle
2
Gibt es eine Möglichkeit, das Powershell-Skript ohne den vollständigen Pfad auszuführen, wenn sich das Skript und die Exe im selben Ordner befinden? Oder ist es möglich, einen relativen Pfad zu verwenden?
Guanome
7
Wenn sich die Exe im selben Ordner befindet, können Sie dies tun .\foo.exeund auch einen relativen Pfad ..\..\foo.exeund einen relativen Pfad mit Leerzeichen verwenden & '..\..\path with spaces\foo.exe'.
Keith Hill
Wenn Sie Pipes in Ihrem Befehl haben, sollten Sie Anführungszeichen verwenden : cmd /c "C:\temp\strarc.exe -cjd:M:\ | C:\temp\strarc.exe -s:8 -xd:N:\".
Larkee
2

CD in der Powershell an den Speicherort der EXE-Datei. Beispielsweise:

CD C: \ Benutzer \ Administratoren \ Downloads

PS C: \ Benutzer \ Administratoren \ Downloads> & '. \ Aaa.exe'

Das Installationsprogramm wird angezeigt und folgt den Anweisungen auf dem Bildschirm.

zufälliger Typ
quelle
genau das was ich will! Führen Sie eine EXE-Datei & '. \ aaa.exe' aus
Sharif Yazdian
2
  1. Klone $ args
  2. Schieben Sie Ihre Argumente in ein neues Array
  3. & $ path $ args

Demo:

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

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

& $exepath $myArgs
NoDocCat
quelle
Thx @nodoccat, arbeitete wie ein Zauber, um einen Docker-Befehl mit einer sehr langen Liste von Argumenten zu starten.
Danidemi
1

Da ich kein Entwickler bin, habe ich eine Lösung gefunden, indem ich mehrere ps-Befehle in einer Zeile ausgeführt habe. Z.B:

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

Durch Platzieren eines "(doppelten Anführungszeichens) vor dem & (kaufmännisches Und) wird die ausführbare Datei ausgeführt. In keinem der Beispiele, die ich gefunden habe, wurde dies erwähnt. Ohne die doppelten Anführungszeichen wird die Eingabeaufforderung ps geöffnet und wartet auf die Eingabe.

RichardE
quelle
Hallo RichardE. Können Sie die Formatierung Ihrer Antwort verbessern? Im Bearbeitungsmodus wird eine Formatierungshilfe bereitgestellt. Schauen Sie sich diese an.
Dorian Turba