Powershell-Aufruf von msbuild mit verschachtelten Anführungszeichen
Mithilfe von Powershell und Psake Paket zu erstellen und die Bereitstellung für eine visual studio-Lösung.
Versuch zum bereitstellen eines Datenbank-Projekts mithilfe von msbuild - die arbeiten richtig mit MS-DOS-visual studio-Befehlszeile
msbuild /target:Deploy /p:UseSandboxSettings=false /p:TargetConnectionString="aConnectionWithSpacesAndSemiColons" "aDatabaseProjectPathWithSpaces"
gleichen Methode-Aufruf führt zu einem Fehler beim Aufruf von powershell
& msbuild /target:Deploy /p:UseSandboxSettings=false /p:TargetConnectionString="aConnectionWithSpacesAndSemiColons" "aDatabaseProjectPathWithSpaces"
Bezug auf Leerzeichen und kann nicht herausfinden, wie zu replizieren dieser Aufruf in der powershell - Beispiel-Datenbank connectionstring
Data Source=.\SQL2008;Initial Catalog=DocumentExecution;Integrated Security=True;
InformationsquelleAutor der Frage JohnF | 2011-06-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurze Version
Wie Sie übergeben ein argument mit Anführungszeichen in eine native PowerShell-Befehl aus?
Verwenden Sie einfache Anführungszeichen statt der doppelten Anführungszeichen in der argument-string:
"/p:Target='Data Source=(local)\SQL;Integrated Security=True'"
→
/p:Target='Data Source=(local)\SQL;Integrated Security=True'
Verwenden backslash-escaping für doppelte Anführungszeichen im argument Zeichenfolge∗:
'/p:Target=\"Data Source=(local)\SQL;Integrated Security=True\"'
→
/p:Target="Data Source=(local)\SQL;Integrated Security=True"
Wenn das eingebettete Zitate werden nur verwendet, um zu behandeln, das argument als eine einzige Zeichenfolge, sondern als ein erforderlicher Teil der parameter, dann die folgenden verwendet werden können:
Zitieren, das gesamte argument-string, anstelle der Einbettung der Zitate in die Argumentation:
'/p:Target=Data Source=(local)\SQL;Integrated Security=True'
→
/p:Target=Data Source=(local)\SQL;Integrated Security=True
Flucht alle PowerShell-Sonderzeichen mit backticks∗ (dies kann nur durchgeführt werden als in-line-argument):
/p:Target=`"Data Source=`(local`)\SQL`;Integrated Security=True`"
oder
/p:Target=Data` Source=`(local`)\SQL`;Integrated` Security=True
→
/p:Target=Data Source=(local)\SQL;Integrated Security=True
Die vollständige Befehlszeile Beispiel (unter Verwendung der zweiten alternative):
Lange Version
Aufrufen native Befehle ist etwas, dass taucht ganz ein bisschen wie Leute bewegen sich zwischen den legacy-cmd-system und PowerShell (fast so viel wie die "Trennung Parameter mit Kommata" gotcha ;).
Habe ich versucht, und Summe up, alles, was ich weiß, zum Thema Kommando-Aufruf in der PowerShell (v2 und v3) hier, zusammen mit allen Beispielen und Referenzen, die ich aufbringen kann.
1) Aufruf Nativer Befehle Direkt
1.1) In seiner einfachsten Form, für eine ausführbare Datei befindet, in die Umgebungsvariable path der Befehl direkt aufgerufen werden könnengenauso, wie Sie Sie nennen würde, eine PowerShell-cmdlet.
1.2) Außerhalb der Umgebung Weg, für Befehle in ein bestimmtes Verzeichnis (inklusive der aktuellen), der vollständige oder relative Pfad zu dem Befehl kann verwendet werden,. Die Idee: die Betreiber erklären ausdrücklich "ich aufrufen möchte diese Datei", anstatt lassen Sie eine beliebige Datei, die zufällig den gleichen Namen laufen zu bekommen an seiner Stelle (sehen Sie, diese Frage für weitere Informationen über die PowerShell Sicherheit). Andernfalls verwenden Sie einen Pfad, wenn es erforderlich ist, führt zu einem "Begriff wird nicht erkannt" - Fehler.
1.3), Wenn ein Pfad Sonderzeichen enthält, wird der Aufruf-operator oder escape-Zeichen verwendet werden können. Zum Beispiel, eine ausführbare Datei starten mit einer Nummer, oder die sich in einem Verzeichnis mit einem Leerzeichen.
2) Aufruf Nativer Befehle Indirekt
2.1)Wenn Sie nicht schreiben aus einem Befehl interaktiv, sondern haben stattdessen den Pfad in einer variable gespeichert, der Aufruf-operator kann auch verwendet werden, um den Befehl aufzurufen Namen in eine variable.
2.2) Die übergebenen Argumente zu einem Befehl kann auch gespeichert werden in der Variablen. Argumente, die in Variablen übergeben werden können einzeln, oder in einem array. Für Variablen, die Leerzeichen enthalten, PowerShell wird automatisch die Flucht der Räume so, dass die native-command-sieht es als ein einziges argument. (Beachten Sie, dass der Aufruf-operator behandelt den ersten Wert als den Befehl und die übrigen Werte als Argumente, die Argumente sollten nicht kombiniert werden mit dem Befehl variable.)
2.3) Die array-format ist besonders nützlich für den Aufbau einer dynamischen Liste von Argumenten für einen nativen Befehl. Für jedes argument anerkannt werden, die als eigenständige parameter, ist es wichtig, die Argumente erhalten, gespeichert in einer array-Variablen, und nicht nur verwurschtelt zusammen in eine Zeichenfolge. (Beachten Sie, dass die gängige Abkürzung
$args
ist eine automatische variable in PowerShell, die kann dazu führen, die Werte der gespeicherten überschrieben wird; stattdessen ist es besser, verwenden Sie einen beschreibenden Namen wie$msbuildArgs
zu vermeiden, den Namenskonflikt.)2.4) Auch für Skripts, Funktionen, cmdlets, und dergleichen, PowerShell v2 senden können benannte Argumente, die in einer hashtable mit einer Technik namens "splatting", ohne befürchten zu müssen, über parameter um. Dies funktioniert nicht mit native-Befehle, die nicht an der PowerShell-Objekt-Modell und können nur string-Werte.
3) Aufruf Nativer Befehle Mit Komplizierten Argumenten
3.1) Für einfache Argumente, die automatische escaping verwendet, für die native-Befehle ist in der Regel ausreichend. Jedoch, für Klammer, dollar-Zeichen, Leerzeichen und solche, Zeichen verwendet, die von PowerShell müssen escaped werden, um gesendet werden, um native Befehleohne dass Sie interpretiert durch den parser. Diese kann getan werden, mit der "backtick" escape-Zeichen,
`
oder, indem er das argument in einem einzigen-quote string.3.2) das ist Leider nicht so einfach, wenn doppelte Anführungszeichen beteiligt sind. Als Teil der argument-Verarbeitung für systemeigene Befehle die PowerShell-Prozessor versucht zu normalisieren, alle doppelten Anführungszeichen im argument so, dass der Inhalt des Arguments, sans Anführungszeichen, übergeben wird als einen einzelnen Wert zu den nativen Befehl. Die native-command-parameter-Verarbeitung erfolgt in einem separaten Schritt nach der Analyse, so normale Flucht wird nicht funktionieren, für "doppelte Anführungszeichen"; nur entging einfache Anführungszeichen oder backslash-Escape-Anführungszeichen können verwendet werden,.
3.3) PowerShell v3 Hinzugefügt, eine neue stop-parsing-symbol
--%
(sieheabout_Parsing
). Wenn verwendet, bevor die komplizierten Argumente,--%
werden Argumente übergeben werden wie Sie ist ohne jede Analyse oder variable expansion, außer für cmd-wie%ENVIRONMENT_VARIABLE%
Werte.Diese können auch verwendet werden, um de-munge eine einzelne Zeichenfolge, die mehrere Argumente an, indem Sie die stop-parsing-symbol in einer Zeichenkette (string)∗ (obwohl die beste Vorgehensweise ist, um nicht munge Argumente in den ersten Platz).
4) Debuggen Systemeigener Befehle
Gibt es zwei wichtige tools, die für das Debuggen der Argumente PowerShell geht auf systemeigene Befehle.
4.1) Die erste ist
EchoArgs.exe
eine Konsole-Anwendung aus der PowerShell Community Extensions , schreibt einfach wieder die Argumente übergeben werden zwischen Spitzen Klammern (siehe die Beispiele oben).4.2) Die zweite ist
Trace-Command
ein cmdlet kann, zeigen viele details, wie die PowerShell-Prozesse auf eine pipeline. Insbesondere dieNativeCommandParameterBinder
trace-Quelle wird zeigen, was PowerShell empfängt und weitergibt an einen nativen Befehl.Andere Ressourcen
Artikel
Fragen
InformationsquelleAutor der Antwort Emperor XLII
Das alles könnte sein, viel einfacher, wenn Sie die
Start-Process
- cmdlet mit dem -ArgumentList-parameter. Ich bin überrascht, dass dies noch nicht schon erwähnt.Beispiel:
Hier ist eine Methode, die ich verwenden gerne ein bisschen besser, die es erlaubt, Variablen-Ersetzung:
InformationsquelleAutor der Antwort Trevor Sullivan
Setzen Sie den gesamten parameter in Anführungszeichen:
Den extra-level zu zitieren, bedeutet, dass PSH nicht Prozess, den Inhalt mit PSH Regeln. (Alle single-quotes innerhalb des Strings müssen verdoppelt—dies ist die einzige Art von Flucht, die in einer PSH single quoted string).
InformationsquelleAutor der Antwort Richard
@Richard - Tests führt zu einer anderen Fehlermeldung, dass keine gültige Projekt-Datei bereitgestellt.
Ich haben dies durch echoargs pscx Helfer zeigen einige ausführlichere Beispiele.
Mit einzelnen quoatation Marken einwickeln der TargetConnectionString - Powershell wertet jeden Raum im connectionstring, wie eine neue Zeile ein:
Trennt die einzelnen parameter mit backticks stellt das erste problem = keine Anführungszeichen um den connectionstring:
c
/p:TargetConnectionString="Data Source=(local)\SQLEXPRESS;Integrated Security=True;Pooling=False"
"C:\program Dateien\MyProjectName.dbproj"
Hinzufügen backticks zu Anführungszeichen verhält sich wie in Beispiel 1:
Mithilfe der @ - operator zu versuchen, teilen Sie die Parameter noch ignoriert die Zitate:
Backticks zu entkommen, die connectionstring-line-Trennlinien - gleichen Ergebnissen wie in Beispiel 1:
InformationsquelleAutor der Antwort JohnF
Dein problem ist, dass die PowerShell nicht entziehen Anführungszeichen, wenn es geht Sie in Kommandozeilen-Applikationen. Ich lief in das ich und dachte, dass PowerShell aß die Anführungszeichen. Genau dies tun.
InformationsquelleAutor der Antwort JasonMArcher
Dank JohnF Antwort, ich war in der Lage, diese Figur ein, endlich.
Kurz, aber backticks vor den Anführungszeichen UND das Semikolon. Etwas weniger (oder mehr!) wird es vermasseln.
InformationsquelleAutor der Antwort moswald
Es ist erwähnt in den Artikeln von diese Antwortaber mit PowerShell 3 Sie können --% zum stoppen der normalen parsing-PowerShell.
InformationsquelleAutor der Antwort Lars Truijens