Wie kann man die Windows-Eingabeaufforderung dazu bringen, einfache Anführungszeichen wie doppelte Anführungszeichen zu behandeln?

Wie kann man die Windows-Eingabeaufforderung dazu bringen, einfache Anführungszeichen wie doppelte Anführungszeichen zu behandeln?

Mein Szenario ist einfach - ich kopiere Skriptbeispiele aus demMercurial Online-Buchund sie in eine Windows-Eingabeaufforderung einzufügen. Das Problem besteht darin, dass die Beispiele im Buch Zeichenfolgen in einfachen Anführungszeichen verwenden. Wenn eine Zeichenfolge in einfachen Anführungszeichen an die Windows-Eingabeaufforderung übergeben wird, erkennt diese nicht, dass alles zwischen den einfachen Anführungszeichen zu einer Zeichenfolge gehört.

Beispielsweise der folgende Befehl:

hg commit -m 'Initial commit'

kann nicht so in eine Eingabeaufforderung eingefügt werden, da diese es 'Initial commit'als zwei Zeichenfolgen behandelt - 'Initialund commit'. Ich muss den Befehl nach dem Einfügen bearbeiten und das ist ärgerlich.

Ist es möglich, die Windows-Eingabeaufforderung anzuweisen, einfache Anführungszeichen ähnlich wie doppelte zu behandeln?

BEARBEITEN

Nach der Antwort von JdeBP habe ich ein wenig recherchiert. Hier ist die Zusammenfassung:

  • Der Mercurial-Einstiegspunkt sieht folgendermaßen aus (es ist ein Python-Programm):

    def run():
        "run the command in sys.argv"
        sys.exit(dispatch(request(sys.argv[1:])))
    
  • Daher habe ich ein kleines Python-Programm erstellt, um die von Mercurial verwendete Befehlszeilenverarbeitung nachzuahmen:

    import sys
    print sys.argv[1:]
    
  • Hier ist das Unix-Konsolenprotokoll:

    [hg@Quake ~]$ python 1.py  "1 2 3"
    ['1 2 3']
    [hg@Quake ~]$ python 1.py  '1 2 3'
    ['1 2 3']
    [hg@Quake ~]$ python 1.py  1 2 3
    ['1', '2', '3']
    [hg@Quake ~]$
    
  • Und hier ist das entsprechende Windows-Konsolenprotokoll:

    C:\Work>python 1.py  "1 2 3"
    ['1 2 3']
    
    C:\Work>python 1.py  '1 2 3'
    ["'1", '2', "3'"]
    
    C:\Work>python 1.py  1 2 3
    ['1', '2', '3']
    
    C:\Work>
    

Man kann deutlich erkennen, dass Windows einfache Anführungszeichen nicht als doppelte Anführungszeichen behandelt. Und das ist der Kern meiner Frage.

Antwort1

Das Anführungszeichen kann in der command.com-Eingabeaufforderung nicht geändert werden. Sie können jedoch PowerShell verwenden, das sowohl einfache als auch doppelte Anführungszeichen als Anführungszeichen akzeptiert. Sie funktionieren genauso wie in Unix-Shells. Das heißt, einfache Anführungszeichen erweitern Variablen nicht, doppelte Anführungszeichen hingegen schon.

Möglicherweise treten immer noch Probleme mit Anführungszeichen in Anführungszeichen auf. Ich habe beispielsweise Strawberry Perl auf meinem Windows-Computer installiert. Wenn ich es perl -e 'print time, "\n" 'in PowerShell ausführe, wird eine Ausgabe wie diese angezeigt 1321375663SCALAR(0x15731d4). Ich muss die doppelten Anführungszeichen maskieren, damit es wie erwartet funktioniert:perl -e 'print time, \"\n\" '

Antwort2

Erstens ist eine Eingabeaufforderung kein Befehlsinterpreter. (Eine Eingabeaufforderung ist das Dingangezeigt durchein Befehlsinterpreter.) Zweitens haben Ihr Kommandointerpreter, die Eingabeaufforderungen, die er ausgibt, und Win32-Konsolengar nichtsdamit zu tun.

In Win32-Programmen ist das Aufteilen der Befehlszeile in „Wörter“ – die NUL-terminierten Multibyte-Zeichenketten, die Programme in den Sprachen C und C++ als das übergebene Argumentarray betrachten main()– Aufgabe der Laufzeitbibliotheken dieser Programme. Unter Unix und Linux übernimmt die Shell die Wortaufteilung, da das Betriebssystem tatsächlich mit einem Argumentarray arbeitet. Dies ist bei Win32 nicht der Fall. Unter Win32 arbeitet das Betriebssystem selbst mit einemBefehlsschwanz: Aeinzellange Zeichenfolge, die noch alle Anführungszeichen enthält, die ursprünglich in der Befehlszeile eingegeben wurden. (EsIstDieser Befehlsteil wird von einem Befehlsinterpreter teilweise verarbeitet, bevor er an das Zielprogramm übergeben wird. Dies hat jedoch nichts mit der Worttrennung zu tun.)

In Ihrem Fall wird die Laufzeitbibliothek für Ihr hgProgramm mit diesem Befehlssatz ausgeliefert:

commit -m 'Erstes Commit'

Die Laufzeitbibliothek, mit der das Programm kompiliert wurde, weiß nicht, dass Sie ein einfaches Anführungszeichen als Leerzeichen für Anführungszeichen gemeint haben, weildas ist nicht die KonventionDie Konvention befasst sichnurin doppelten Anführungszeichen (und Backslashes vor doppelten Anführungszeichen).

Diese Konvention ist in die Laufzeitbibliothek integriert, die mit dem Compiler bereitgestellt wurde, mit dem das Programm ursprünglich erstellt wurde. Wenn Sie die Konvention ändern möchten, müssen Sie erneut verknüpfenjedes einzelne Programm, das Sie auf diese Weise ausführen möchtenmit einer speziellen, von Ihnen erstellten Laufzeitbibliothek, die auch einfache Anführungszeichen erkennt. Dies ist natürlich unpraktisch (es sei denn, es handelt sich um Cygwin-Programme).

Ein weitaus praktischerer Ansatz besteht darin, das zu tun, was Sie bereits tun: Erkennen Sie, dass Windows nicht Unix ist, und passen Sie die Beispiele entsprechend an, bevor Sie sie verwenden.

Antwort3

Ich bin ziemlich sicher, dass Sie die Art und Weise, wie DOS Befehle analysiert, nicht bearbeiten können. Das liegt in seiner grundlegenden Programmierung.

Die einzige Lösung, die mir einfällt, um die Dinge zu beschleunigen, besteht darin, ein Editorfenster geöffnet zu lassen und eine Funktion zum Suchen und Ersetzen auszuführen. Dabei werden alle einfachen Anführungszeichen durch doppelte Anführungszeichen ersetzt. Und von dort aus wird das Ganze dann in DOS kopiert und eingefügt.

verwandte Informationen