Wie entkomme ich kaufmännisches Und in Batch-Dateien?

146

Wie entkomme ich kaufmännisches Und in einer Batchdatei (oder über die Windows-Befehlszeile), um mit dem startBefehl Webseiten mit kaufmännischem Und in der URL zu öffnen?

Doppelte Anführungszeichen funktionieren nicht mit start; Dadurch wird stattdessen ein neues Befehlszeilenfenster gestartet.

Update 1 : Die Lösung von Wael Dalloul funktioniert. Wenn die URL URL-codierte Zeichen enthält (z. B. Leerzeichen wird als% 20 codiert) und sich in einer Batchdatei befindet , muss '%' als '%%' codiert werden. Dies ist im Beispiel nicht der Fall.

Beispiel über die Befehlszeile ( CMD.EXE):

start http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8

wird darin enden, dass

http://www.google.com/search?client=opera 

wird im Standardbrowser geöffnet und diese Fehler im Befehlszeilenfenster:

'rls' is not recognized as an internal or external command,
operable program or batch file.
'q' is not recognized as an internal or external command,
operable program or batch file.
'sourceid' is not recognized as an internal or external command,
operable program or batch file.
'ie' is not recognized as an internal or external command,
operable program or batch file.
'oe' is not recognized as an internal or external command,
operable program or batch file.

Plattform: Windows XP 64-Bit-SP2.

Peter Mortensen
quelle
1
Ich habe die Antwort von belugabob bearbeitet, damit sie jetzt funktioniert. Es ist nur eine Eigenart, bei startder das Zitieren des Arguments fehlschlägt, wenn es ohne nachzudenken angewendet wird. Insgesamt denke ich, dass es einfacher und weniger fehleranfällig ist, das Argument in Anführungszeichen zu setzen, als jedem Zeichen zu entkommen, das dort entkommen muss.
Joey
Was ist mit Pluszeichen, +was soll ich vorstellen, um ihm zu entkommen?
William
In PowerShell start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"funktioniert, weil PowerShell Anführungszeichen entfernt
phuclv

Antworten:

91

Von einem cmd :

  • &wird wie folgt entkommen: ^&(basierend auf der Antwort von @Wael Dalloul )
  • % muss nicht entkommen

Ein Beispiel:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%20and%20percentage+in+cmd^&sourceid=opera^&ie=utf-8^&oe=utf-8

Aus einer Batch-Datei

  • &wird wie folgt entkommen: ^&(basierend auf der Antwort von @Wael Dalloul )
  • %wird wie folgt maskiert: %%(basierend auf dem OPs-Update)

Ein Beispiel:

start http://www.google.com/search?client=opera^&rls=en^&q=escape+ampersand%%20and%%20percentage+in+batch+file^&sourceid=opera^&ie=utf-8^&oe=utf-8
Lasse Christiansen
quelle
Es könnte auch ein Beispiel für das Entkommen von "%" enthalten - dann kann ich meine Frage bereinigen.
Peter Mortensen
@ PeterMortensen Definitiv - Ich habe meine Antwort aktualisiert.
Lasse Christiansen
2
Welchen Charakteren soll ich auch entkommen? Mir ist aufgefallen, dass ich "|" durch "^ |".
Flüssigkeit
In diesem Fall %muss nicht maskiert werden, denn wer wäre dumm genug, um 20andals Umgebungsvariable zu definieren? Wenn Sie dies getan haben, start http://www.google.com/search?q=ampersand%20and%20percentagekönnten Sie http://www.google.com/search?q=ampersandsomething-silly20percentagestattdessen auf verlinken . Mit ^%Escape in cmd funktioniert das Beispiel wie erwartet.
TamaMcGlinn
145

&wird verwendet, um Befehle zu trennen. Daher können Sie verwenden ^, um die zu entkommen &.

Wael Dalloul
quelle
3
Was ist mit Pluszeichen, +was soll ich vorstellen, um ihm zu entkommen?
William
Dies ist die allgemeinere Lösung. Es funktioniert auch, wenn ein Parameter eines Befehlszeilenprogramms ein oder mehrere kaufmännische Und-Zeichen enthält. Ich bin gerade darauf gestoßen - der Parameter war CGW5COMM & 10C4 & 8301 .
Peter Mortensen
Ein kaufmännisches Und mit dem Caret-Zeichen zu zitieren ^ scheint nicht unter allen Umständen zu funktionieren. Der Versuch, msdeploy.exe mit dem Schalter / p: auszuführen, um ein Kennwort mit einem kaufmännischen Und zu übergeben, scheint beispielsweise mit keiner von mir versuchten Permutation zu funktionieren (Caret-Anführungszeichen, doppelte Anführungszeichen, erstes Dummy-Argument).
Derek Greer
3
Ein Beispiel für die Verwendung ^wäre von unschätzbarem Wert.
jpmc26
2
@ jpmc26 Ich habe in dieser Antwort ein Beispiel hinzugefügt .
Lasse Christiansen
29

Sie können es in Anführungszeichen setzen, wenn Sie ein erstes Dummy-Argument angeben.

Beachten Sie, dass Sie in diesem Fall ein erstes Dummy-Argument angeben müssen, da startdas erste Argument als Titel für die neuen Konsolenfenster behandelt wird, wenn es in Anführungszeichen steht. Folgendes sollte also funktionieren (und funktioniert hier):

start "" "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"
Belugabob
quelle
OK, ich gebe zu, dass der Titel nicht vollständig mit der Frage im Inneren übereinstimmt. (Denkst du, ich sollte den Titel länger machen?)
Peter Mortensen
Immerhin nicht so 'Doh' - in Anführungszeichen zu setzen war die richtige Idee - wusste einfach nichts über den Titel des Konsolenfensters. Danke Johannes!
Belugabob
PowerShell entfernt Anführungszeichen aus den Argumenten , sodass dies fehlschlägt. Sie müssen nur start "http://www.google.com/search?client=opera&rls=en&q=escape+ampersand&sourceid=opera&ie=utf-8&oe=utf-8"auf PowerShell
phuclv
20
explorer "http://www.google.com/search?client=opera&rls=...."
Adatapost
quelle
12

Der Befehl

echo this ^& that

funktioniert wie erwartet und gibt aus

this & that

Der Befehl

echo this ^& that > tmp

funktioniert auch, indem der String in die Datei "tmp" geschrieben wird. Allerdings vor einem Rohr

echo this ^& that | clip

das ^ wird ganz anders interpretiert. Es wird versucht, die Ausgabe der beiden Befehle "echo this" und "that" in die Pipe zu schreiben. Das Echo funktioniert dann "das" gibt einen Fehler aus. Sprichwort

echo this ^& echo that | clip

wird die Zeichenfolgen "dies" und "das" in die Zwischenablage setzen.

Ohne das ^:

echo this & echo that | clip

Das erste Echo wird in die Konsole geschrieben und nur die Ausgabe des zweiten Echos wird an den Clip weitergeleitet (ähnlich wie bei der Umleitung "> tmp"). Wenn also die Ausgabe umgeleitet wird, zitiert das ^ nicht das &, sondern bewirkt, dass es vor und nicht nach der Umleitung angewendet wird.

Um ein & zu leiten, müssen Sie es zweimal zitieren

echo this ^^^& that | clip

Wenn Sie die Zeichenfolge in eine Variable einfügen

set m=this ^& that

dann

set m

wird ausgegeben

m=this & that

aber das Offensichtliche

echo %m%

schlägt fehl, weil, nachdem Windows die Variable ersetzt hat, was zu

echo this & that

Es analysiert dies als neuen Befehl und versucht, "das" auszuführen.

In einer Batchdatei können Sie die verzögerte Erweiterung verwenden :

setlocal enableDelayedExpansion
echo !m!

Um in eine Pipe auszugeben, müssen wir alle & s im Variablenwert durch ^ & ersetzen, was wir mit der Syntax% VAR: FROM = TO% tun können:

echo !m:^&=^^^&! | clip

In der Befehlszeile aktiviert "cmd / v" die verzögerte Erweiterung:

cmd /v /c echo !m!

Dies funktioniert auch beim Schreiben in eine Pipe

cmd /v /c echo !m! | clip

Einfach.

Denis Howe
quelle
Ihre Lösung für Rohre funktioniert, aber Ihre Schlussfolgerungen sind mehr oder weniger falsch. Übrigens. ein einfaches echo this ^^^& that | clipfunktioniert auch. Um das Magic Pipe-Handling zu verstehen, lesen Sie SO: Warum schlägt die verzögerte Erweiterung fehl, wenn Sie sich in einem Pipeline-Codeblock befinden?
Jeb
1

Wenn Sie echoeine Zeichenfolge benötigen , die ein kaufmännisches Und enthält, helfen Anführungszeichen nicht, da sie auch in der Ausgabe angezeigt werden. Verwenden Sie in einem solchen Fall for:

for %a in ("First & Last") do echo %~a

... in einem Batch-Skript:

for %%a in ("First & Last") do echo %%~a

oder

for %%a in ("%~1") do echo %%~a
Jaroslav Záruba
quelle
0

Wenn Sie Leerzeichen im Namen der Datei haben und ein Zeichen haben, müssen Sie entkommen:

Sie können einfache UND doppelte Anführungszeichen verwenden, um Fehlbezeichnungen im Befehl zu vermeiden.

scp ./'files name with spaces/internal folder with spaces/"text & files stored.txt"' .

Der ^Charakter entweicht die Zitate aus anderen Gründen .

be-ns
quelle