502 Stimmen

So führen Sie eine EXE-Datei in PowerShell mit Parametern mit Leerzeichen und Anführungszeichen aus

Wie führen Sie den folgenden Befehl in PowerShell aus?

C:\Program Dateien \IIS\Microsoft Web-Bereitstellung \msdeploy.exe -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=. \mydestsource Integrierte Sicherheit=false;Benutzer-ID=sa;Pwd=sapass!;Datenbank=mydb;",computername=10.10.10.10,username=administrator,password=adminpass"

487voto

Keith Hill Punkte 183005

Wenn PowerShell einen Befehl sieht, der mit einer Zeichenkette beginnt, wertet es die Zeichenkette einfach aus, d. h. es gibt sie z. B. per Echo auf den Bildschirm aus:

PS> "Hello World"
Hello World

Wenn Sie möchten, dass PowerShell die Zeichenfolge als Befehlsname interpretiert, verwenden Sie den Aufrufoperator (&) wie folgt:

PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'

Danach müssen Sie wahrscheinlich nur noch Parameter/Argument-Paare zitieren, die Leerzeichen und/oder Anführungszeichen enthalten. Wenn Sie eine EXE-Datei wie diese mit komplexen Befehlszeilenargumenten aufrufen, ist es normalerweise sehr hilfreich, ein Tool zu haben, das Ihnen zeigt, wie PowerShell die Argumente an die EXE-Datei sendet. Die PowerShell-Gemeinschaftserweiterungen hat ein solches Werkzeug. Es heißt echoargs. Ersetzen Sie einfach die EXE-Datei durch echoargs - und lassen Sie alle Argumente an Ort und Stelle, und es zeigt Ihnen, wie die EXE-Datei die Argumente empfängt:

PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>

Mit echoargs können Sie experimentieren, bis Sie es richtig hinbekommen, zum Beispiel:

PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>

Es stellte sich heraus, dass ich vorher zu sehr versucht hatte, die doppelten Anführungszeichen um den Verbindungsstring herum beizubehalten. Offenbar ist das nicht nötig, denn selbst cmd.exe entfernt diese.

Übrigens: Hut ab vor dem PowerShell-Team. Sie waren sehr hilfreich, indem sie mir die spezielle Beschwörungsformel für einfache und doppelte Anführungszeichen zeigten, um das gewünschte Ergebnis zu erzielen - wenn man die internen doppelten Anführungszeichen an Ort und Stelle lassen musste :-) Sie wissen auch, dass dies ein Problembereich ist, aber sie richten sich nach der Anzahl der Leute, die von einem bestimmten Problem betroffen sind. Wenn dies für Sie ein Problem darstellt, dann stimmen Sie bitte für diese PowerShell-Fehler einreichen .

Weitere Informationen darüber, wie PowerShell parst, finden Sie in meinem Effektive PowerShell-Blogserie - speziell Punkt 10 - "Verstehen der PowerShell-Parsing-Modi"

UPDATE 4/4/2012: Diese Situation ist in PowerShell V3 viel einfacher zu handhaben. Siehe dies Blogbeitrag für Details .

102voto

Microb Punkte 751

Ich hatte Leerzeichen sowohl im Befehl als auch in den Parametern, und das hat bei mir funktioniert:

$Command = "E:\X64\Xendesktop Setup\XenDesktopServerSetup.exe"
$Parms = "/COMPONENTS CONTROLLER,DESKTOPSTUDIO,DESKTOPDIRECTOR,LICENSESERVER,STOREFRONT /PASSIVE /NOREBOOT /CONFIGURE_FIREWALL /NOSQL"

$Prms = $Parms.Split(" ")
& "$Command" $Prms

Es ist im Grunde dasselbe wie Akiras Antwort, aber es funktioniert, wenn Sie Ihre Befehlsparameter dynamisch erstellen und in eine Variable setzen.

83voto

nonolde1er Punkte 795

Fügen Sie einfach die & Operator vor dem .exe-Namen. Hier ist ein Befehl zur Installation von SQL Server Express im Silence-Modus:

$fileExe = "T:\SQLEXPRADV_x64_ENU.exe"
$CONFIGURATIONFILE = "T:\ConfSetupSql2008Express.ini"

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE

77voto

Es gibt eine ganze Reihe von Methoden, die Sie dazu verwenden können.

Es gibt auch andere Methoden wie die Verwendung des Call Operators ( & ), Invoke-Ausdruck cmdlet usw. Sie werden jedoch als unsicher angesehen. Microsoft empfiehlt die Verwendung von Start-Prozeß .

Methode 1

Ein einfaches Beispiel

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root","-proot","-h localhost"

In Ihrem Fall

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync","-source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","-dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`"","computername=10.10.10.10","username=administrator","password=adminpass"

Bei dieser Methode trennen Sie jeden einzelnen Parameter in der ArgumentList durch Kommata.

Methode 2

Einfaches Beispiel

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root -proot -h localhost"

In Ihrem Fall

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-verb:sync -source:dbfullsql=`"Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`" -dest:dbfullsql=`"Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;`",computername=10.10.10.10,username=administrator,password=adminpass"

Diese Methode ist einfacher, da sie die Eingabe der Parameter in einem Zug ermöglicht.

Beachten Sie, dass in der Powershell zur Darstellung der Anführungszeichen ( " ) in einer Zeichenkette sollten Sie die Grabakzent ( ` ) (Dies ist die Taste oberhalb der Tabulatortaste auf der amerikanischen Tastatur).

-NoNewWindow wird verwendet, um den neuen Prozess im aktuellen Konsolenfenster anzuzeigen. Standardmäßig öffnet Windows PowerShell ein neues Fenster.

Referenzen: Powershell/Skripting/Start-Process

53voto

Akira Yamamoto Punkte 4406

Das hat bei mir funktioniert:

& 'D:\Server\PSTools\PsExec.exe' @('\\1.1.1.1', '-accepteula', '-d', '-i', $id, '-h', '-u', 'domain\user', '-p', 'password', '-w', 'C:\path\to\the\app', 'java', '-jar', 'app.jar')

Legen Sie einfach Pfade oder Verbindungsstrings in ein Array-Element und teilen Sie die anderen Dinge in je ein Array-Element auf.

Hier gibt es viele andere Möglichkeiten: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx

Microsoft sollte diesen Weg vereinfachen und mit der Syntax der Eingabeaufforderung kompatibel machen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X