So funktioniert dieser Windows-Befehl: echo% path:; = & echo.%

Antworten:

22

Das ist eine interessante Lösung, die ich noch nie gesehen habe. Lass mich versuchen zu erklären:

  1. Verwenden Sie, um den gesamten Pfad zu drucken echo %path%. Dadurch werden alle Verzeichnisse in einer einzelnen Zeile gedruckt, die durch Semikolons ( ;) getrennt sind.
  2. Verwenden Sie zum Suchen / Ersetzen einer Zeichenfolge in einer Variablen, %path:a=b%die alle aZeichen durch ersetztb
  3. echo. wird verwendet, um eine neue Zeile zu drucken
  4. &wird zum Trennen von Befehlen verwendet, z. B. echo line1&echo line2werden zwei Zeilen gedruckt
  5. Tatsächlich werden Semikolons im Pfad durch einen Befehl zum Drucken einer neuen Zeile ersetzt. Oder vielleicht wird es so interpretiert, als würde man "durch ;nichts ersetzen und dann eine neue Zeile drucken". Ich kann dazu keine Dokumentation finden, es ist also nur meine Interpretation. Ehrlich gesagt wusste ich nicht einmal, dass das möglich ist, aber los geht's. UPDATE Meine Interpretation dieses Schritts scheint falsch zu sein und wird besser von wizzwizz4 erklärt .
Berend
quelle
Wofür werden %% Zeichen verwendet echo path? Können wir das nicht sagen ? werden %% für Variablen verwendet?
Yekanchi
1
Ja, das ist richtig, diese werden verwendet, um den Wert einer Variablen zu erhalten. Zum Beispiel: set greeting=Hellound dann echo %greeting%. Verwirrenderweise handelt PATHes sich sowohl um einen Befehl als auch um eine Variable, sodass Sie den Befehl eingeben pathoder echo %path%dasselbe Ergebnis erzielen.
Berend
Wie heißt diese Syntax? ist es Regex? oder etwas nur in Windows CMD verwendet
Yekanchi
Ich bin mir nicht sicher, ob es einen Namen dafür gibt, es ist nur die Art und Weise, wie Variablen in DOS funktionieren. Andere Sprachen, wie Bash, verwenden $PATHzum Beispiel.
Berend
2
Das hat nichts mit DOS zu tun, Berend; und echo.ist nicht "der Befehl zum Drucken einer neuen Zeile". Dies ist der Befehlsinterpreter von Microsoft für Windows NT cmd. und das echo.ist einfach der Befehl zum Drucken eines Pfadelements, der sicherstellt, dass, wenn das Pfadelement leer ist, nicht auf die andere Funktionalität von umgeschaltet wirdecho . Das erste echosollte eigentlich auch eines echo.sein.
JdeBP
30

Hierbei wird die Substitution von Befehlszeilenvariablen verwendet. %path:;=&echo.%bedeutet " %path%, aber ersetze alle ;s durch &echo.". Dies bedeutet, dass mit set path=C:\Windows\System32;C:\Windows\;;C:\Python37;:

echo %path:;=&echo.%

wird:

echo C:\Windows\System32&echo.C:\Windows\&echo.&echo.C:\Python37&echo.

Da &es sich um ein Befehlstrennzeichen handelt, ist dies äquivalent zu:

echo C:\Windows\System32
echo.C:\Windows\
echo.
echo.C:\Python37
echo.

Aufgrund der Macken von DOS Batch, echo.ist identisch mit, echo außer wenn nichts danach ist. In diesem Fall wird einfach nichts gedruckt, anstatt Ihnen mitzuteilen, ob aktiviert ECHOoder deaktiviert ist. Dies wird die Ausgabe machen:

C:\Users\wizzwizz4> echo %path:;&echo.%
C:\Windows\System32
C:\Windows\

C:\Python37

C:\Users\wizzwizz4> 

Eigentlich sollte es sein echo.%path:;=&echo.%, den Fall zu berücksichtigen, bei dem %PATH%mit a begonnen wird ;, aber dieser Befehl ist sowieso ziemlich clever.


Wenn Sie sich mit detaillierten Details befassen, sollten Sie diese wirklich echo( anstelle von verwenden echo.. Dies liegt daran, echo.dass es Probleme geben kann, wenn eine Datei aufgerufen wird echo, und es ist langsam, weil die Festplatte ( %CD%und ich denke auch, alle %PATH%) jedes Mal überprüft werden muss, wenn sie ausgeführt wird. (Ich habe keine Kopie von Windows, daher kann ich sie nicht selbst überprüfen. Betrifft das Vorhandensein der Datei nur %CD%oder irgendwo in der Welt , und was bewirkt sie?)%PATH%echoecho.

wizzwizz4
quelle
Dies ist ein langjähriges Verhalten von Microsoft / IBM-Befehlsinterpretern unter verschiedenen Betriebssystemen und gilt nicht speziell für Stapelskripten. Wie ich vor superuser.com/a/310157/38062 Jahren festgestellt habe, gibt es neben Leerzeichen auch mehrere Interpunktionszeichen, die als Befehlsnamen-Abschlusszeichen gelten.
JdeBP
@JdeBP Ich denke, einer der effizienteren ist echo), aber ich erinnere mich nicht wirklich. ;-(
wizzwizz4
3
echo.ist die, die vor Jahren am häufigsten im Umlauf war. Es ist das in vielen Büchern. Effizienz ist nicht das Problem. Verrücktes Verhalten, wenn verschiedene Dateien zufällig existieren. Als ich cmdin OS / 2 einen 32-Bit-Ersatz für das 16-Bit- Format schrieb, war das Unterbrechen von Befehlsnamen bei diesen Satzzeichen und dieses sehr unregelmäßige Parsing-Verhalten eines der Dinge, die ich absichtlich nicht dupliziert und auf das Dokument gesetzt habe Liste der Unterschiede. Ich habe echodotstattdessen einen externen Befehl eingegeben, den man echo.nach Belieben aliasen kann.
JdeBP
@JdeBP Das hört sich wirklich interessant an! Glaubst du, du könntest etwas davon dokumentieren ?
wizzwizz4
Wenn Sie verschiedenen Links zu Kommentaren folgen, gelangen Sie zu einem Forum-Nachrichtenclaming eines Drittanbieters, bei dem echo(es sich um die einzig sichere Version handelt.
Neil