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 .