Jak działa to polecenie systemu Windows: echo% path:; = & echo.%

23

Szukając rozwiązania do drukowania ścieżek w pathzmiennej w wierszu poleceń systemu Windows, przyszedłem do tego rozwiązania. odpowiedzią jest to polecenie:

echo %path:;=&echo.%

teraz zastanawiam się, jak to działa.

yekanchi
źródło

Odpowiedzi:

22

To ciekawe rozwiązanie, którego nigdy wcześniej nie widziałem. Pozwól mi spróbować wyjaśnić:

  1. Aby wydrukować całą ścieżkę, użyj echo %path%. Spowoduje to wydrukowanie wszystkich katalogów w jednym wierszu oddzielonym średnikami ( ;)
  2. Aby wyszukać / zamienić ciąg w zmiennej, użyj, %path:a=b%który zastąpi wszystkie aznakib
  3. echo. służy do drukowania nowego wiersza
  4. &służy do oddzielania poleceń, np. echo line1&echo line2wypisze dwie linie
  5. W efekcie średniki w ścieżce są zastępowane poleceniem drukowania nowego wiersza. A może jest to interpretowane jako „zamień na ;nic, a następnie wydrukuj nowy wiersz”. Nie mogę znaleźć żadnej dokumentacji na ten temat, więc to tylko moja interpretacja. Szczerze mówiąc, nawet nie wiedziałem, że to możliwe, ale proszę bardzo. AKTUALIZACJA Moja interpretacja tego kroku wydaje się być zła i lepiej wyjaśniona przez wizzwizz4 .
Berend
źródło
do czego używane są znaki %%, prawda echo path? są używane %% dla zmiennych?
yekanchi
1
Tak, to prawda, są one używane do uzyskania wartości zmiennej. Na przykład: set greeting=Helloa następnie echo %greeting%. Myląco PATHzdarza się, że jest zarówno poleceniem, jak i zmienną, więc wpisanie polecenia pathlub echo %path%będzie miało taki sam wynik.
Berend
jak nazywa się ta składnia? czy to wyrażenie regularne? lub coś używanego tylko w Windows CMD
yekanchi,
Nie jestem pewien, czy istnieje na to nazwa, tak po prostu działają zmienne w DOS. Inne języki, takie jak bash, używają $PATHna przykład.
Berend
2
To nie ma nic wspólnego z DOS, Berend; i echo.nie jest „poleceniem wypisania nowego wiersza”. Jest to interpreter poleceń Microsoft dla Windows NT cmd; a echo.jest to po prostu polecenie drukowania elementu ścieżki, zapewniające, że jeśli element ścieżki jest pusty, nie przełącza się na inną funkcjonalnośćecho . Pierwszy też echopowinien być echo..
JdeBP
30

Jest to oparte na podstawianiu zmiennych w wierszu poleceń. %path:;=&echo.%oznacza „ %path%, ale zamień wszystkie ;s na &echo.”. Oznacza to, że przy set path=C:\Windows\System32;C:\Windows\;;C:\Python37;:

echo %path:;=&echo.%

staje się:

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

Ponieważ &jest to separator poleceń, jest to równoważne z:

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

Ze względu na dziwactwa DOS Batch, echo.jest identyczny, z echo wyjątkiem sytuacji, gdy nic po nim nie ma. W takim przypadku po prostu nic nie drukuje, zamiast mówić, czy ECHOjest włączony, czy wyłączony. Spowoduje to, że wynik:

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

C:\Python37

C:\Users\wizzwizz4> 

Naprawdę, należy wziąć echo.%path:;=&echo.%pod uwagę przypadek, w którym %PATH%zaczyna się od ;, ale to polecenie i tak jest całkiem sprytne.


Wchodząc w szczegółowe detale, naprawdę echo( powinno się go używać echo.. Jest tak, ponieważ echo.może mieć problemy, gdy plik ma nazwę echo, i jest powolny, ponieważ musi sprawdzać dysk ( %CD%i myślę, że cały %PATH%) za każdym razem, gdy jest uruchamiany. (Nie mam kopii systemu Windows, więc nie mogę jej sam sprawdzić; czy to tylko %CD%czy gdziekolwiek, %PATH%że echowpłynie to na obecność pliku echo.i co on robi?)

wizzwizz4
źródło
Jest to długotrwałe zachowanie interpreterów poleceń Microsoft / IBM w kilku systemach operacyjnych i nie jest specyficzne dla skryptów wsadowych. Jak zauważyłem na stronie superuser.com/a/310157/38062 lat temu, oprócz białych znaków istnieje kilka znaków interpunkcyjnych, które liczą się jako znaki zakończenia nazwy polecenia.
JdeBP
@JdeBP Myślę, że jednym z bardziej wydajnych jest echo), ale tak naprawdę nie pamiętam. ;-(
wizzwizz4
3
echo.to ten, który ludzie krążyli najwięcej lat temu. Jest to jeden z wielu książek. Wydajność nie jest problemem. Dziwne zachowanie, gdy zdarzają się różne pliki, jest. Kiedy napisałem 32-bitowy zamiennik 16-bitowego cmdw OS / 2, łamanie nazw poleceń w tych znakach interpunkcyjnych i to bardzo nieregularne zachowanie podczas analizowania jest jedną z rzeczy, których celowo nie powielałem, i które nałożyłem na udokumentowane lista różnic. echodotZamiast tego wykonałem polecenie zewnętrzne , które można było aliasować echo.według potrzeb.
JdeBP
@JdeBP To brzmi naprawdę interesująco! Myślisz, że mógłbyś udokumentować niektóre z nich ?
wizzwizz4,
Jeśli podążysz za różnymi linkami komentarzy, trafisz na stronę zewnętrzną, która echo(jest jedyną bezpieczną wersją.
Neil