Подтвердить что ты не робот

Выделение круглых скобок в круглых скобках для пакетного файла

Это то, что я пытаюсь сделать:

(
@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. Любые идеи?

4b9b3361

Ответ 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, затем вы передаете содержимое файла в клип, и оно готово для вас, чтобы вставить туда, где вы хотите.