Wenn PowerShell einen Befehl sieht, der mit einer Zeichenfolge beginnt, wertet es nur die Zeichenfolge aus, dh, es wird normalerweise auf dem Bildschirm angezeigt, z. B.:
PS> "Hello World"
Hello World
Wenn PowerShell die Zeichenfolge als Befehlsnamen interpretieren soll, 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 in Anführungszeichen setzen, die Leerzeichen und / oder Anführungszeichen enthalten. Wenn Sie eine solche EXE-Datei 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 Community Extensions verfügen über ein solches Tool. Es heißt Echoargs. Sie ersetzen einfach die EXE-Datei durch Echoargs, lassen alle Argumente an Ort und Stelle und zeigen Ihnen, wie die EXE-Datei die Argumente empfängt, zum Beispiel:
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 verstanden haben, 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 mich zuvor zu sehr bemüht hatte, die doppelten Anführungszeichen um die Verbindungszeichenfolge beizubehalten. Anscheinend ist das nicht notwendig, weil sogar cmd.exe diese entfernen wird.
Übrigens, Hut ab vor dem PowerShell-Team. Sie waren sehr hilfreich, um mir die spezifische Beschwörung von einfachen und doppelten Anführungszeichen zu zeigen, um das gewünschte Ergebnis zu erzielen - wenn Sie die internen doppelten Anführungszeichen beibehalten müssen. :-) Sie erkennen auch, dass dies ein Schmerzbereich ist, aber sie werden von der Anzahl der Menschen bestimmt, die von einem bestimmten Problem betroffen sind. Wenn dies ein Schmerzbereich für Sie ist, stimmen Sie diese PowerShell-Fehlerübermittlung ab .
Weitere Informationen zum Parsen von PowerShell finden Sie in meiner Effective PowerShell-Blogserie - insbesondere in Punkt 10 - "Grundlegendes zu PowerShell-Parsing-Modi".
UPDATE 04.04.2012: Diese Situation wird in PowerShell V3 viel einfacher zu handhaben. Weitere Informationen finden Sie in diesem Blogbeitrag .