Як працює ця команда Windows: echo% path:; = & echo.%


23

Пошук рішення для друку патчів всередині pathзмінної у Windows Command-Line я прийшов до цього рішення. відповідь така команда:

echo %path:;=&echo.%

тепер мені цікаво, як це працює.


Відповіді:


22

Це цікаве рішення, якого я ніколи раніше не бачив. Дозвольте спробувати пояснити:

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

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

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%починається з а ;, але ця команда все-таки досить розумна.


Потрапляючи в детальні деталі, насправді 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.