Как работает эта команда windows: echo% path:; = & echo.%


23

В поисках решения для печати путей внутри pathпеременной в командной строке Windows я пришел к этому решению. ответ этой команды:

echo %path:;=&echo.%

теперь интересно, как это работает.


Ответы:


22

Это интересное решение, которое я никогда не видел раньше. Позвольте мне попытаться объяснить:

  1. Чтобы напечатать весь путь, используйте echo %path%. Это выведет все каталоги в одну строку, разделенную точкой с запятой ( ;)
  2. Чтобы найти / заменить строку в переменной, используйте %path:a=b%которая заменит все aсимволы наb
  3. echo. используется для печати новой строки
  4. &используется для разделения команд, например echo line1&echo line2, напечатает две строки
  5. Фактически точки с запятой в пути заменяются командой для печати новой строки. Или, может быть, это интерпретируется как «заменить ;ничем, а затем вывести новую строку». Я не могу найти никакой документации по этому вопросу, так что это просто моя интерпретация. Честно говоря, я даже не знал, что это возможно, но вот, пожалуйста. ОБНОВЛЕНИЕ Моя интерпретация этого шага, похоже, неверна , и ее лучше объяснить с помощью wizzwizz4 .

для чего используются знаки %%, можем ли мы сказать echo path? %% используется для переменных?
еканчи

1
Да, это правильно, они используются для получения значения переменной. Например: set greeting=Helloи тогда echo %greeting%. Заблуждение, PATHслучается, что это и команда, и переменная, поэтому ввод команды pathили echo %path%будет иметь один и тот же результат.
Беренд

как называется этот синтаксис? это регулярное выражение? или что-то, используемое только в Windows CMD
yekanchi

Я не уверен, есть ли имя для этого, это просто, как переменные работают в DOS. $PATHНапример, другие языки, такие как bash .
Беренд

2
Это не имеет ничего общего с DOS, Беренд; и echo.не является «командой для печати новой строки». Это интерпретатор команд Microsoft для Windows NT cmd; и echo.просто команда для печати элемента пути, гарантирующая, что если элемент пути пуст, он не переключается на другие функцииecho . Первое echoдействительно должно быть echo.слишком.
JdeBP

30

Это использует подстановку переменных командной строки. %path:;=&echo.%означает " %path%, но замените все ;s на &echo.". Это означает, что при set path=C:\Windows\System32;C:\Windows\;;C:\Python37;:

echo %path:;=&echo.%

будет выглядеть так:

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

Поскольку &это разделитель команд, это эквивалентно:

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

Из-за причуд DOS Batch, echo.идентичен, за echo исключением случаев, когда после него ничего нет. Если это так, он просто ничего не печатает, вместо того, чтобы сообщать, включен ECHOон или нет. Это сделает вывод:

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

C:\Python37

C:\Users\wizzwizz4> 

Действительно, следует echo.%path:;=&echo.%учитывать случай, когда %PATH%начинается с a ;, но в любом случае эта команда довольно умная.


Попадая в подробные детали, действительно echo( следует использовать вместо echo.. Это потому, что echo.могут возникнуть проблемы, когда у вас есть файл с именем echo, и он медленный, потому что он должен проверять диск ( %CD%и я думаю, что также все %PATH%) каждый раз, когда он запускается. (Я не имею копию Windows , так что я не могу проверить это сам, это просто %CD%или где - нибудь в %PATH%том , что наличие echoфайла будет влиять echo.и то , что он делает?)


Это давнее поведение командных интерпретаторов Microsoft / IBM в нескольких операционных системах и не относится к пакетным сценариям. Как я отметил на сайте superuser.com/a/310157/38062 года назад, в дополнение к пробелу есть несколько знаков препинания, которые считаются символами завершения имени команды.
JdeBP

@JdeBP Я думаю, что один из наиболее эффективных echo), но я действительно не помню. ;-(
wizzwizz4

3
echo.это тот, который люди использовали чаще всего, много лет назад. Это один во многих книгах. Эффективность не проблема. Странное поведение, когда существуют разные файлы. Когда я написал 32-битную замену для 16-битной cmdв OS / 2, нарушение имен команд в этих знаках препинания и это крайне нерегулярное поведение при разборе - это одна из вещей, которые я намеренно не дублировал, и которую я поставил на документированный список отличий. echodotВместо этого я сделал внешнюю команду, которая может быть псевдонимом echo.по желанию.
JdeBP

@JdeBP Это звучит действительно интересно! Как вы думаете, вы могли бы документировать некоторые из этого ?
wizzwizz4

Если вы переходите по различным ссылкам на комментарии, вы echo(попадаете на сторонний форум с сообщением о том, что это единственная безопасная версия.
Нил
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.