21

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

echo %path:;=&echo.%

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

2 ответа2

29

Это использует подстановку переменных командной строки. %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. И что оно делает?)

22

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .