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"

2voto

Tony Wall Punkte 1378

Das hat bei mir funktioniert:

PowerShell.exe -Command "& ""C:\Some Script\Path With Spaces.ps1"""

Der Schlüssel scheint zu sein, dass der gesamte Befehl in äußere Anführungszeichen eingeschlossen ist, das kaufmännische Und" wird verwendet, um anzugeben, dass eine weitere untergeordnete Befehlsdatei ausgeführt wird, und schließlich werden die Pfad-/Dateinamen in Anführungszeichen (mit Leerzeichen) gesetzt, die Sie ursprünglich ausführen wollten.

Dies ist auch der einzige Workaround für das MS-Connect-Problem, dass -File keine Rückgabewerte ungleich Null zurückgibt und -Command die einzige Alternative ist. Bisher dachte man jedoch, dass eine Einschränkung von -Command darin besteht, dass es keine Leerzeichen unterstützt. Ich habe auch diese Rückmeldung aktualisiert.

http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-when-using-the-file-option

1voto

Yotam Omer Punkte 14806

Wenn Sie nur eine Datei im aktuellen Verzeichnis ausführen müssen und keine Lust haben, den gesamten Pfad auszuschreiben, verwenden Sie Get-Location :

& "$(Get-Location)\example.exe" arg1 arg2 arg3

Beachten Sie die & am Anfang. Abgegrenzte Argumente sind zu platzieren die Zitate.

1voto

crokusek Punkte 4951

Für den Namen der ausführbaren Datei wird der neu-alias cmdlet kann verwendet werden, um Leerzeichen oder das Hinzufügen der ausführbaren Datei zur $PATH-Umgebung zu vermeiden.

PS> new-alias msdeploy "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
PS> msdeploy ...

Um PS-Aliase aufzulisten oder zu ändern, siehe auch

PS> get-alias
PS> set-alias

De Jeffery Hicks Artikel

Andere Antworten gehen auf die Argumente ein.

0voto

drizin Punkte 1502

Der folgende Code funktioniert perfekt auf meinem Laptop:

& $msdeploy `
-source:package="$publishFile" `
-dest:auto,computerName="$server",includeAcls="False",UserName="$username",Password="$password",AuthType="$auth" `
-allowUntrusted  `
-verb:sync  `
-enableRule:DoNotDeleteRule `
-disableLink:AppPoolExtension  `
-disableLink:ContentExtension  `
-disableLink:CertificateExtension  `
-skip:objectName=filePath,absolutePath="^(.*Web\.config|.*Environment\.config)$" `
-setParam:name=`"IIS Web Application Name`",value="$appName"

Als ich dann versuchte, das direkt auf einem Server auszuführen, bekam ich diese Fehler "Unrecognized argument ...etc.... All arguments must begin with "-". "

Nachdem ich alle möglichen Workarounds ausprobiert hatte (ohne Erfolg), fand ich heraus, dass Powershell auf dem Server (Windows 2008 R2) Version 3.0 war, während mein Laptop 5.0 hat (Sie können "$PSVersionTable" verwenden, um die Version zu sehen).

En Aktualisierung der Powershell auf die neueste Version umgestellt hat, funktioniert es wieder.

-1voto

CBee Punkte 31

Um ein Batch-Skript mit exiftool.exe in ein Powershell-Skript zu übertragen, stand ich vor der Herausforderung, einerseits '-s, "-s und sogar ${Dateiname} an den Befehl zu übergeben und andererseits Variablen in diesen Parametern auszufüllen.

Für den Anfang: Die Ersetzung durch "Echochars" ist genial. Sie zeigt deutlich, was als einzelner Parameter gruppiert wird und was als nächster Parameter landet.

In Powershell ist es ähnlich wie in Perl (und Unix-Skripting): die verwendeten Anführungszeichen haben ihre Bedeutung.

  • Zeichenketten zwischen "-s. Die Zeichenkette wird interpretiert (Variablen werden gefüllt)
  • Zeichenketten zwischen '-s. Die Zeichenkette wird nicht (oder nur sehr eingeschränkt) interpretiert
  • das Escape-Zeichen ist ` (das Anführungszeichen). Das nächste Zeichen verliert seine besondere Bedeutung. Vergleichbar mit dem \ (Rückwärtsstrich) bei Unix/Linux/Perl.

Einige Beispiele:

${ExifArgs} += "-if `"`${FileName} !~ /desktop.ini/i`""
${ExifArgs} += '-dateFormat "%Y\%Y%m\%Y%m%d_%H%M%S"'
${ExifArgs} += ('"' + "-FileName<${NewFotos}\${SourceName}\" + '${DateTimeOriginal}_${ImageWidth}x${ImageHeight}_${Model;s/ //g}_${FileName;s/^.*([0-9]{4})[^0-9].*$/\1/}.%e' + '"')

Ein Aufruf von echoargs mit dem obigen Befehl ergibt die folgende Ausgabe (die Zahlen sind aus Datenschutzgründen gehackt):

Arg 11 is <-if>
Arg 12 is <${FileName} !~ /desktop.ini/i>
Arg 13 is <-dateFormat>
Arg 14 is <%Y\%Y%m\%Y%m%d_%H%M%S>
Arg 15 is <-FileName<D:\Pictures\NewFotos\${DateTimeOriginal}_${ImageWidth}x${ImageHeight}_${Model;s/ //g}_${FileName;s/^.*([0-9]{4})[^0-9].*$/\1/}.%e>

Sehen Sie, wie die erste Zeile die Argumente 11 und 12 erzeugt: die äußeren "-s werden entfernt, um die gesamte Zeile im Array zu speichern. Die inneren "-s, zitiert durch das `-s, sind dazu da, das Argument zusammenzuhalten (während das -if das vorherige Argument ist)

Die zweite zeigt Argument 13 und 14: die Verwendung von "-s zwischen '-s. Es besteht keine Notwendigkeit, "-s" zu verwenden.

In der letzten Zeile (die arg 15 erzeugt): Die einzelne Zeichenfolge wird mithilfe von powershell ()-s und +-s erstellt, um mehrere Zeichenfolgen zu einer einzigen Zeichenfolge zu verketten. Es werden sowohl durch " als auch durch ' begrenzte Zeichenketten verwendet, damit einige ${}-s von der Powershell und einige für exiftool ausgefüllt werden können. Und ja, einige Sonderzeichen der Powershell werden in die Dokumente übertragen.

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