Пакет: экранирование с помощью каретки

Я всегда ненавидел пакетную обработку и до сих пор ненавижу, даже для самых простых вещей я предпочитаю C или PHP/Perl. Но на этот раз я не мог обойтись без него, ****вздох****.

Я хотел перенаправить эхо-команду на другую команду. Например:

echo example | more

но я также хотел иметь возможность использовать специальные символы в эхо-части канала:

echo & | more

Что, конечно же, не сработало. Итак, я попытался:

echo ^& | more

Что тоже не сработало. Потом методом проб и ошибок нашел:

echo ^^^& | more

и это сработало. Но как заинтересованный программист я удивляюсь, почему. Почему ^& не сработало, а ^^^& сработало?


person Jori    schedule 25.06.2012    source источник
comment
Я нашел это, может быть, это полезно для вас? stackoverflow.com/questions/3813370/   -  person JohnP    schedule 25.06.2012
comment
+1, даже если вы пренебрегаете красотой всемогущей партии, LOL. Я понимаю, что партия чрезвычайно причудлива, непоследовательна и недостаточно документирована. Но тогда я думаю, что проблема в том, почему я получаю от этого столько удовольствия :-)   -  person dbenham    schedule 25.06.2012
comment
@dbenham, есть ли попытки задокументировать пакетный синтаксис из Windows?   -  person Pacerier    schedule 25.08.2015
comment
@Pacerier - stackoverflow.com/q/4094699/1012053   -  person dbenham    schedule 06.02.2018


Ответы (2)


Причина связана с тем, как Windows реализует каналы — каждая сторона канала выполняется в своей собственной оболочке CMD. Ваша команда echo ^& | more фактически пытается выполнить

C:\Windows\system32\cmd.exe /S /D /c" echo & "

слева и

C:\Windows\system32\cmd.exe /S /D /c" more "

справа. Вы можете понять, почему левая сторона терпит неудачу - попытка повторить неэкранированный &. Побег был использован на начальной фазе синтаксического анализа до того, как будет выполнена фактическая левая сторона.

Также легко понять, почему ваше решение работает. Левая сторона echo ^^^& | more становится

C:\Windows\system32\cmd.exe /S /D /c" echo ^& "

При работе с конвейерами Windows возникает много тонких сложностей. Дополнительную информацию см. в разделе Почему отложенное развертывание не работает внутри блока кода, передаваемого по конвейеру?. Выбранный ответ содержит лучшую информацию, но я рекомендую прочитать вопрос и все ответы, чтобы получить контекст выбранного ответа.

person dbenham    schedule 25.06.2012
comment
Большое спасибо за ваш полезный ответ! - person Jori; 26.06.2012

Первый ^ экранирует сам символ ^ (второй ^), а третий ^ экранирует &.

Когда вы запускаете такую ​​команду, как ECHO ^& | MORE, ^& заменяется оболочкой на & до того, как вывод будет передан в MORE.

Итак, когда вы запускаете ECHO ^^^& | MORE, оболочка заменяет ^^ на ^, а ^& на &, а затем направляет вывод на MORE.

person aphoria    schedule 25.06.2012
comment
Ваш первый абзац хорош для скороговорки... - person Pacerier; 25.08.2015