CMD-Kompatibilität und CMDebug / TCC-RT, Teil 2
Nach meiner Anfrage nach CMD-Batchdateien funktionierte das nicht CMDebug or TCC, hat mir ein Benutzer eine Batchdatei mit einer merkwürdigen Verwendung der CMD-Syntax für die verzögerte Variablenerweiterung geschickt.
CMD unterstützt die !var! Syntax zum Verzögern der Variablenerweiterung zum Zeitpunkt der Ausführung eines Befehls und nicht zum Zeitpunkt des Lesens der Anweisung. Angenommen, Sie möchten eine Liste aller Dateien in einem Verzeichnis erstellen. Ihr erster Versuch könnte etwa so aussehen:
setze FILES= Für %f in (*) setzen Sie FILES=%FILES% %f
Das wird nun funktionieren CMDebug und TCC, aber es wird nicht Arbeit im CMD. Der Grund dafür ist, dass CMD am Ende tatsächlich Folgendes ausführt:
[code]für %f in (*) setze FILES= %f[/code]
und am Ende erhalten Sie eine Liste, die nur die letzte Datei im Verzeichnis enthält.
Deshalb hat Microsoft die Option hinzugefügt, die Variablenerweiterung in CMD zu verzögern (konfigurierbar entweder beim Start oder mit dem Befehl SETLOCAL). Es ist nicht notwendig TCC Batch-Dateien, wird aber in unterstützt TCC und CMDebug aus Gründen der Kompatibilität.
Also seit TCC Dies wurde bereits unterstützt. Was war die Inkompatibilität? Das Problem war mit dieser Zeile:
setze „regVal=!regVal:%%=?!“
und ein entsprechendes:
setze „regVal=!regVal:?=%%!“
Was ist hier der Zweck? Der Code ersetzt a ? für jeden % in der Variablen und späteres Umkehren der Substitution. Warum eine verzögerte Variablenerweiterung verwenden, da es sich hierbei nicht um eine IF- oder FOR-Anweisung oder eine Befehlsgruppe handelt und sich der Wert zwischen dem Zeitpunkt, zu dem die Zeile gelesen wurde, und dem Zeitpunkt, zu dem die Zeile ausgeführt wurde, nicht ändern wird?
Weil CMD mit so etwas nicht umgehen kann:
setze „regVal=%regVal:%%=?%“
Das Argument wird beim ersten Treffer beendet %, also erhalten Sie Folgendes:
setze „regVal=%regVal:%“
OK, warum also nicht einfach dem entkommen? % Welchen Charakter möchten Sie ersetzen?
setze „regVal=%regVal:^%=?%“
Das funktioniert gut in TCC und CMDebug, schlägt aber in CMD fehl. (Möglicherweise handelt es sich um einen Fehler oder einfach um ein nicht unterstütztes Verhalten – in der CMD-Dokumentation wird es nicht erwähnt.) Daher verwendete der Entwickler eine verzögerte Variablenerweiterung, um das zu verhindern % nicht so interpretiert werden, dass es den Variablennamen umschließt. Als CMD die Zeile auswertete, stellte es eine Verdoppelung fest %, die es in eine Single umwandelte %, und die Zeile wurde wie folgt ausgeführt:
setze „regVal=!regVal:%=?!“
Warum hat das also nicht funktioniert? TCC? weil TCC hatte nicht damit gerechnet, einen Unentkommenen zu finden % Zeichen innerhalb einer Ersetzungszeichenfolge in einer verzögerten Erweiterungsvariablen. Denn warum solltest du das tun? Kein Grund – es sei denn, Sie möchten ersetzen % Zeichen in CMD eingegeben, und Sie konnten dies auf keine der erwarteten Arten tun. (Es gibt mehrere Möglichkeiten, dies zu tun TCC, allesamt verständlicher als diese gequälte Syntax.)
Ich habe den aktuellen Versionen von Unterstützung für diese CMD-Syntax hinzugefügt TCC, TCC-RT und CMDebug.
Senden Sie weiterhin diese verrückten CMD-Batchdateien!