Команда
echo this ^& that
работает как положено, выдает
this & that
Команда
echo this ^& that > tmp
также работает, записывая строку в файл "tmp". Тем не менее, перед трубой
echo this ^& that | clip
^ интерпретируется совершенно по-разному. Он пытается записать выходные данные двух команд «повторить это» и «это» в канал. Эхо сработает, тогда «то» выдаст ошибку. Высказывание
echo this ^& echo that | clip
поместит строки "this" и "that" в буфер обмена.
Без ^:
echo this & echo that | clip
первый эхо-сигнал будет записан на консоль, и только второй выходной эхо-сигнал будет передан для ограничения (аналогично для перенаправления «> tmp»). Таким образом, когда вывод перенаправляется, ^ не заключает в кавычки &, а вместо этого заставляет его применяться до перенаправления, а не после.
Чтобы передать &, вы должны указать это дважды
echo this ^^^& that | clip
Если вы поместите строку в переменную
set m=this ^& that
тогда
set m
выведет
m=this & that
но очевидное
echo %m%
терпит неудачу, потому что после того, как Windows заменяет переменную, в результате
echo this & that
он анализирует это как новую команду и пытается выполнить "то".
В пакетном файле вы можете использовать отложенное расширение :
setlocal enableDelayedExpansion
echo !m!
Чтобы вывести на канал, мы должны заменить все & s в значении переменной на ^ &, что мы можем сделать с помощью синтаксиса% VAR: FROM = TO%:
echo !m:^&=^^^&! | clip
В командной строке «cmd / v» включает отложенное расширение:
cmd /v /c echo !m!
Это работает даже при записи в канал
cmd /v /c echo !m! | clip
Simple.