Batch-Echo mit Sonderzeichen verwenden

74

Das ist vielleicht ganz einfach, aber im Internet gab es keine Antworten darauf. Ich möchte eine XML-Zeile per Batch in eine Datei übertragen, aber das XML-Abschluss-Tag für die Umleitung ">" wird falsch verstanden. Die Linie ist wie folgt:

echo <?xml version="1.0" encoding="utf-8" ?> > myfile.xml

Gibt es eine Möglichkeit, dem Batch-Parser einen Hinweis zu geben, eine spezielle Zeichenfolge nicht zu interpretieren? Ich habe doppelte Anführungszeichen verwendet, aber es schreibt sie auch in die Datei! Die Datei sollte nach dem Echo folgendermaßen aussehen:

<?xml version="1.0" encoding="utf-8" ?>
Amir Zadeh
quelle
2
Mögliches Duplikat der Escape-Winkel in einer Windows-Eingabeaufforderung
Helen
1
Mögliches Duplikat des entkommenden Batch-Charakters
phuclv

Antworten:

110

Sie können Shell-Metazeichen mit ^folgenden Elementen entkommen :

echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml

Beachten Sie, dass echoeine integrierte Shell nicht den üblichen Konventionen für das Zitieren entspricht. Wenn Sie also nur das Argument zitieren, werden die Anführungszeichen ausgegeben, anstatt sie zu entfernen.

Joey
quelle
4
@Nevin: Sie müssen nach wie vor jeden entkommen <und >. Da ist nichts Besonderes. Davon abgesehen würde ich echoaus ... offensichtlichen Gründen davon abraten, große XML-Dateien in einer einzigen Zeile zu speichern.
Joey
: Tut mir leid, noch einmal zu fragen. Es funktioniert nicht bei mir. Der Code ist unten angegeben. Es tut uns leid, dass Sie den Code nicht im richtigen Format angegeben haben. Echo ^ <? Xml version = "1.0" encoding = "utf-8"? ^> ^ <Configuration ^> ^ <packageSources ^> ^ <add key = "nuget.org" value = "nuget.org/api/v2/"; / ^> ^ <add key = "aspnetwebstacknightlyrelease" value = "myget.org/f/aspnetwebstacknightlyrelease/"; / ^> ^ </ packageSources ^> ^ </ configuration ^ >> MyFile.xml - Nevin Raj vor 1 Stunde
Nevin Raj Victor
1
@Nevin: Es gibt Semikolons darin, die nicht da sein sollten. Abgesehen davon erzeugt es gültiges XML für mich.
Joey
Sie waren absolut korrekt. Das Semikolon verursachte die Probleme. Danke
Nevin Raj Victor
4
Nicht zu Charge benötigen sehr oft, ich meine Top - 5 illegal zu vergessen echoZeichen: <, >, ', (und ). Alle können mit einem Caret abgegrenzt werden ^. Weitere illegale Zeichen hier, aber die meisten davon sind nicht in meinem typischen Anwendungsfall.
Rich C
23

Um Sonderzeichen wie '>' unter Windows mit Echo zu verwenden, müssen Sie ein spezielles Escape-Zeichen davor platzieren.

Zum Beispiel

echo A->B

funktioniert nicht, da '>' durch '^' maskiert werden muss:

 echo A-^>B

Siehe auch Escape-Sequenzen . Geben Sie hier die Bildbeschreibung ein

Es gibt eine kurze Batch-Datei, die einen grundlegenden Satz von Sonderzeichen und deren Escape-Sequenzen druckt.

Orbitcowboy
quelle
1
Bei Anführungszeichen ist das Caret jedoch das Escape-Zeichen. Die Verwendung von zwei Anführungszeichen ist falsch, da lediglich ein zweites Anführungszeichen hinzugefügt wird. echo Line1"" & echo line2vsecho Line1^" & echo line2
jeb
Vielen Dank für die Bereitstellung der Beispieltabelle. Es hat mir mit mehreren Charakteren geholfen.
Ben
20

eine andere Methode:

@echo off

for /f "useback delims=" %%_ in (%0) do (
  if "%%_"=="___ATAD___" set $=
  if defined $ echo(%%_
  if "%%_"=="___DATA___" set $=1
)
pause
goto :eof

___DATA___
<?xml version="1.0" encoding="utf-8" ?>
 <root>
   <data id="1">
      hello world
   </data>
 </root>
___ATAD___


rem # 
rem # 
walid2mi
quelle
Gute Idee, Daten in ein Skript einzufügen!
yO_
Gute Lösung zum Entpacken einer Textdatei aus einer Batchdatei. Die Zeile if defined $ echo(%%_sollte erweitert werden, if defined $ echo(%%_ >> myxmlfile.xmlum die Ausgabe in eine Datei zu kopieren.
PMF
Können wir Variablen haben __DATA__?
Bilogic
18

Eine einfache Lösung ist die verzögerte Erweiterung, da dadurch keine Sonderzeichen geändert werden.

set "line=<?xml version="1.0" encoding="utf-8" ?>"
setlocal EnableDelayedExpansion
(
  echo !line!
) > myfile.xml

BEARBEITEN: Eine andere Lösung besteht darin, ein verschwindendes Zitat zu verwenden .

Diese Technik verwendet ein Anführungszeichen, um die Sonderzeichen zu zitieren

@echo off
setlocal EnableDelayedExpansion
set ""="
echo !"!<?xml version="1.0" encoding="utf-8" ?>

Der Trick funktioniert, da in der Sonderzeichenphase das führende Anführungszeichen !"!den Rest der Zeile beibehält (wenn keine anderen Anführungszeichen vorhanden sind).
Und in der verzögerten Expansionsphase wird das !"!Testament durch den Inhalt der Variablen ersetzt "(ein einfaches Anführungszeichen ist ein legaler Name!).

Wenn Sie mit deaktivierter verzögerter Erweiterung arbeiten, können Sie FOR /Fstattdessen eine Schleife verwenden.

for /f %%^" in ("""") do echo(%%~" <?xml version="1.0" encoding="utf-8" ?>

Da dies jedoch etwas nervig erscheint, können Sie auch ein Makro erstellen.

set "print=for /f %%^" in ("""") do echo(%%~""

%print%<?xml version="1.0" encoding="utf-8" ?>
%print% Special characters like &|<>^ works now without escaping
jeb
quelle
1
echo !line!funktioniert, solange !die lineVariable keine enthält . Irgendein Mittel dafür?
Davor Josipovic
2
Nein, wenn es ein lineenthält !, funktioniert es problemlos, aber es ist nicht immer offensichtlich, wie die Ausrufezeichen in die Variable eingefügt werden. Versuchen Sieset "line=Hello^!" & echo !line!
jeb
Sie sind 100% richtig. Ich muss etwas durchgesehen haben!
Davor Josipovic
10

Die Möglichkeit, ein >Zeichen auszugeben , besteht darin, ihm ein ^Escape-Zeichen voranzustellen :

echo ^>

wird einfach gedruckt

>
Aleks G.
quelle
2

Die Antwort von Joey funktionierte nicht für mich. Nach der Ausführung

  echo ^<?xml version="1.0" encoding="utf-8" ?^> > myfile.xml

Ich habe diesen Fehler Bash: Syntaxfehler in der Nähe von unerwartetem Token `> '

Diese Lösung hat bei mir funktioniert:

 echo "<?xml version=\"1.0\" encoding=\"utf-8\">" > myfile.txt

Siehe auch http://www.robvanderwoude.com/escapechars.php

Competo
quelle
1
Beachten Sie, dass dies die Anführungszeichen in der Ausgabe
Ohad Schneider
0

Warum nicht ein einfaches Anführungszeichen verwenden?

echo '<?xml version="1.0" encoding="utf-8" ?>'

Ausgabe

<?xml version="1.0" encoding="utf-8" ?>
Fangxing
quelle
2
Die Frage bezieht sich auf Batch / cmd. Dies wird in Batch / cmd sicherlich nicht funktionieren.
Stephan
0

Hier ist noch ein Ansatz mit SETundFOR /F

@echo off

set "var=<?xml version="1.0" encoding="utf-8" ?>"

for /f "tokens=1* delims==" %%a in ('set var') do echo %%b

und Sie können es verschönern wie:

@echo off
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
set "print{[=for /f "tokens=1* delims==" %%a in ('set " & set "]}=') do echo %%b"
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::


set "xml_line.1=<?xml version="1.0" encoding="utf-8" ?>"
set "xml_line.2=<root>"
set "xml_line.3=</root>"

%print{[% xml_line %]}%
npocmaka
quelle
-1

Der Fluchtcharakter hat ^auch bei mir nicht funktioniert. Die einfachen Anführungszeichen haben bei mir funktioniert (mit ansible Scripting)

shell: echo  '{{ jobid.content }}'

Ausgabe:

 {
    "changed": true,
    "cmd": "echo  '<response status=\"success\" code=\"19\"><result><msg><line>query job enqueued with jobid 14447</line></msg><job>14447</job></result></response>'",
    "delta": "0:00:00.004943",
    "end": "2020-07-31 08:45:05.645672",
    "invocation": {
        "module_args": {
            "_raw_params": "echo  '<response status=\"success\" code=\"19\"><result><msg><line>query job enqueued with jobid 14447</line></msg><job>14447</job></result></response>'",
            "_uses_shell": true,
            "argv": null,
            "chdir": null,
            "creates": null,
            "executable": null,
            "removes": null,
            "stdin": null,
            "stdin_add_newline": true,
            "strip_empty_ends": true,
            "warn": true
        }
    },
    "rc": 0,
    "start": "2020-07-31 08:45:05.640729",
    "stderr": "",
    "stderr_lines": [],
    "stdout": "<response status=\"success\" code=\"19\"><result><msg><line>query job enqueued with jobid 14447</line></msg><job>14447</job></result></response>",
    "stdout_lines": [
        "<response status=\"success\" code=\"19\"><result><msg><line>query job enqueued with jobid 14447</line></msg><job>14447</job></result></response>"
    ]
Priyanka
quelle
Die Frage bezieht sich auf Batch / cmd. Dies wird in Batch / cmd sicherlich nicht funktionieren.
Stephan