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"

26voto

Darkgaze Punkte 1976

Falls sich jemand fragt, wie man eine ausführbare Datei einfach ausführt:

..... > . \file.exe

ou

......> voll \path\to\file.exe

23voto

Baodad Punkte 2235

Siehe diese Seite: https://slai.github.io/posts/powershell-and-external-commands-done-right/

Zusammenfassung der Verwendung von vshadow als externe ausführbare Datei:

$exe = "H:\backup\scripts\vshadow.exe"
&$exe -p -script=H:\backup\scripts\vss.cmd E: M: P:

15voto

CyrilDex Punkte 177

Sie können verwenden:

Start-Process -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"

Wichtig ist hier, dass FilePath an Position 0 stehen muss, wie im Help Guide beschrieben. Um die Hilfe für ein Commandlet aufzurufen, geben Sie einfach ein Get-Help <Commandlet-name> -Detailed . In diesem Fall ist es Get-Help Start-Process -Detailed .

9voto

Loïc MICHEL Punkte 23754

Neue Escape-Zeichenfolge in PowerShell V3, zitiert aus Neue V3-Sprachfunktionen :

Leichtere Wiederverwendung von Befehlszeilen aus Cmd.exe

Das Internet ist voll von Befehlszeilen, die für Cmd.exe geschrieben wurden. Diese Befehlszeilen funktionieren oft genug in PowerShell, aber wenn sie bestimmte Zeichen enthalten, z. B. ein Semikolon (;), ein Dollarzeichen ($) oder geschweifte Klammern, müssen Sie einige Änderungen vornehmen und wahrscheinlich einige Anführungszeichen hinzufügen. Dies scheint die Quelle vieler kleinerer Kopfschmerzen zu sein.

Um diesem Szenario entgegenzuwirken, haben wir eine neue Möglichkeit geschaffen, das Parsen von Befehlszeilen zu umgehen. Wenn Sie den magischen Parameter --% verwenden, unterbrechen wir das normale Parsen Ihrer Befehlszeile und wechseln zu etwas viel Einfacherem. Wir vergleichen keine Anführungszeichen. Wir halten nicht am Semikolon an. PowerShell-Variablen werden nicht erweitert. Wir erweitern Umgebungsvariablen, wenn Sie die Syntax von Cmd.exe verwenden (z. B. %TEMP%). Ansonsten werden die Argumente bis zum Ende der Zeile (oder der Pipe, wenn Sie eine Pipeline verwenden) unverändert übergeben. Hier ist ein Beispiel:

PS> echoargs.exe --% %USERNAME%,this=$something{weird}
Arg 0 is <jason,this=$something{weird}>

9voto

G-Mac Punkte 1103

Ich konnte meinen ähnlichen Befehl mit folgendem Ansatz zum Laufen bringen:

msdeploy.exe -verb=sync "-source=dbFullSql=Server=THESERVER;Database=myDB;UID=sa;Pwd=saPwd" -dest=dbFullSql=c:\temp\test.sql

Für Ihren Befehl (nicht, dass das jetzt viel helfen würde), würde die Sache etwa so aussehen:

msdeploy.exe -verb=sync "-source=dbfullsql=Server=mysource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;" "-dest=dbfullsql=Server=mydestsource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Die wichtigsten Punkte sind:

  • Verwenden Sie Anführungszeichen für das Quellargument, und entfernen Sie die eingebetteten Anführungszeichen für die Verbindungszeichenfolge
  • Verwenden Sie beim Aufbau der SQL-Verbindungszeichenfolge die alternativen Schlüsselnamen, die keine Leerzeichen enthalten. Verwenden Sie beispielsweise "UID" anstelle von "User Id", "Server" anstelle von "Data Source", "Trusted_Connection" anstelle von "Integrated Security", und so weiter. Bei mir hat es erst funktioniert, als ich alle Leerzeichen aus der Verbindungszeichenfolge entfernt habe.

Ich habe nicht versucht, den Teil "computername" am Ende der Befehlszeile hinzuzufügen, aber ich hoffe, dass diese Information anderen Lesern hilft, ihrem gewünschten Ergebnis näher zu kommen.

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