Выделение круглых скобок в круглых скобках для пакетного файла
Это то, что я пытаюсь сделать:
(
@echo This is some code that is
@echo Important to echo exactly as-is
@echo Even if I use parenthesis
@echo for something (like this)
)|clip
Так что это скопировано в буфер обмена. Я пробовал следующее:
(
@echo This is some code that is
@echo Important to echo exactly as-is
@echo Even if I use parenthesis
@echo for something ^(like this^)
)|clip
Но это, похоже, влияет на мои скобки WANTED, потому что я получаю сообщение об ошибке. Чтобы проверить это, я просто сделал:
(
@echo This is some code that is
@echo Important to echo exactly as-is
@echo Even if I use parenthesis
@echo for something ^(like this^)
FFF
)|clip
Эй! Это почти работает, текст скопирован до "s" в "this". Он не копирует последние скобки или, очевидно, F. Любые идеи?
Ответы
Ответ 1
Очевидно, что вам нужны три кармана: -)
(
@echo This is some code that is
@echo Important to echo exactly as-is
@echo Even if I use parenthesis
@echo for something (like this^^^)
)|clip
Почему? Это немного сложно...
Сначала синтаксический анализатор анализирует блок и ускользает от части this^^^)
до this^)
, здесь скопирована скобка.
Но поскольку вы использовали канал, полный блок будет переведен и перенесен на новый экземпляр cmd.exe.
C:\Windows\system32\cmd.exe /S /D /c" ( @ echo This is some code is ... & @ echo for something (like this^) )"
И в новом экземпляре необходимо снова избежать закрывающей круглой скобки.
Это все!
И для получения дополнительной информации вы можете прочитать аналогичный вопрос
SO: почему задержка с расширением заканчивается, если внутри блока кода с каналом
Ответ 2
Если вас смущает количество кадров, помните, что она всегда равна 2 минус 1. В качестве альтернативы помните, что при первом добавлении 2, во второй раз 4, в третий раз 8,...
Например, (проверено на XP)
(
for /f "tokens=* delims=" %%S in (
'echo X^^^^^^^^^^^^^^^& ^^^^^^^^^^^^^^^| ^^^| find " "'
) do @echo %%S
) | find "X"
Оператор echo считывается сначала нормально, когда DOS анализирует командный файл (1), второй, потому что это внутренняя команда с каналами (DOS, похоже, хочет программы в трубах, а внутренние команды не являются программами) (3), в-третьих, потому что он находится в списке слов "for/f" (см. для /?) (7) и в четвертый раз по причинам, уже указанным в этом потоке (15).
Я также могу отметить, что лично я считаю, что это небрежное кодирование оставляет правильное экранирование горячих символов только потому, что DOS игнорирует отсутствующее экранирование в этом конкретном случае. Поэтому, если я хотел бы повторить буквенную пару круглых скобок в приведенном выше примере, я бы предоставил каждому из 15 кареток, даже если открывающая скобка не нуждается в этом. Тогда любой, кто читает мой код, не должен удивляться, почему одна скобка цитируется, а другая - нет. И как изменить цитату под модификацией кода.
Ответ 3
Тройка-каретка не работает во всех ситуациях. сделайте следующее:
IF EXIST file.txt (
ECHO ...OK
) ELSE (
ECHO TEST THIS: (SOME WORDING! ^^^) > file.txt
)
содержимое файла file.txt:
TEST THIS: (SOME WORDING! ^)
Ответ 4
Мое решение, когда мне нужно использовать закрывающуюся скобку в моем инкапсулированном эхо, заключается в создании переменной с именем% endPar% в начале моего script, примерно так:
@set "endPar=)"
@echo This is some code that is>tmp
@echo Important to echo exactly as-is>>tmp
@echo Even if I use parenthesis>>tmp
@echo for something (like this%endPar%>>tmp
@type tmp|clip
@del tmp
Я немного изменил его и дважды протестировал его.
Код просто выводит эхо в файл с именем tmp, затем вы передаете содержимое файла в клип, и оно готово для вас, чтобы вставить туда, где вы хотите.