Как поместить двойную кавычку в две двойные кавычки в пакетном файле и как избежать двойной кавычки в файле сценария VBA

Итак, я хочу вывести строку, содержащую всего три двойных кавычки. Если я печатаю две двойные кавычки, они просто работают нормально и печатают их (я полагаю, что причина в том, что есть соответствующая закрывающая кавычка), а двойные кавычки, кратные 2, работают нормально, но я не могу повторить нечетное количество из них.

И из моего поиска символ escape-последовательности для двойной кавычки - это сама двойная кавычка, и она не дает мне желаемого результата.

Команда, которую я запускаю:

echo         Item.Subject = Replace(Item.Subject, """, "-")>> try.xyz

ожидая """ с этим.

я пытался

"\""
"\\""
"^""

Я создаю файл bas для импорта в Outlook. И MC ND исправил мою ошибку в файле VBA, который я тоже создаю. Правильный способ - напечатать 4 двойных кавычки, чтобы экранировать двойную кавычку с точки зрения сценария VBA, и, следовательно, обычная печать 4 двойных кавычек решит мою проблему. Вторая двойная кавычка предназначена для экранирования третьей, а первая и последняя - для упоминания строки замены из ответа MC ND.

Большое спасибо, MC ND, что вы меня просветили. :-П

PS: MC ND дал гораздо более подробное объяснение, чем заслуживал этот вопрос, поэтому я расширил вопрос.


person Shruti Saagar    schedule 22.03.2017    source источник
comment
Опубликуйте свой пример кода   -  person Hackoo    schedule 22.03.2017
comment
Также экранируйте закрывающую скобку ): echo Item.Subject = Replace(Item.Subject, ^""", "-"^) приводит к Item.Subject = Replace(Item.Subject, """, "-"), однако язык перевода имеет значение: например, чтобы получить действительный фрагмент кода VBScript, используйте echo Item.Subject = Replace(Item.Subject, """", "-"^)   -  person JosefZ    schedule 22.03.2017
comment
Я действительно хочу создать строку VBScript, в которой говорится о замене каждого вхождения на -. Поэтому я подумал, что эквивалентный код был Item.Subject = Replace(Item.Subject, """, "-") . Поправьте меня, если я ошибаюсь. Спасибо   -  person Shruti Saagar    schedule 22.03.2017


Ответы (1)


Предположение: ваш пакетный код создает файл vbs (или аналогичный)

Ваша проблема не в том, чтобы повторять три цитаты. Ваша проблема в том, что в VBScript двойную кавычку, заключенную в двойные кавычки, нужно экранировать (с точки зрения vbs), а для этого нужно ее удвоить, то есть нужно не три, а четыре кавычки, две из которых разделите строку и два, что означает экранированную двойную кавычку

>>"try.xyz" echo Item.Subject = Replace(Item.Subject, """", "-")

примечание: я переместил перенаправление в начало строки, чтобы избежать проблем со строками, которые могут заканчиваться цифрами, которые могут быть проанализированы как запрос на перенаправление определенного пронумерованного потока.


Предположение. Ваш код НЕ генерирует файл vbs, и экранирование кавычек — это то, что вы указали.

Тогда ваша проблема заключается в том, что нечетное количество кавычек обманывает пакетный синтаксический анализатор, который сохраняет незакрытую строку, которая будет включать перенаправление внутри данных для эха, вместо записи в выходной файл.

Вы можете изменить перенаправление на начало строки, как в предыдущем примере (at в этом случае будет работать, echo все еще не правильно), или вы можете экранировать (с точки зрения пакета) первую кавычку так это не считается двойной кавычкой и заканчивается правильно заключенной в кавычки строкой, не включая перенаправление в выводе

>>"try.xyz" Item.Subject = Replace(Item.Subject, """, "-")
echo Item.Subject = Replace(Item.Subject, ^""", "-") >> "try.xyz"

rem Best use both 
>>"try.xyz" Item.Subject = Replace(Item.Subject, ^""", "-")

Почему бы не избежать внутренней цитаты? Поскольку он уже находится внутри строки в кавычках, экранирование не удастся. Мы можем избежать первого или последнего (в данном случае), но не внутреннего.


Предположение: ваш код не заключен в круглые скобки (for, if, ...) внутри пакетного кода

Тогда в вашем коде нет других проблем, НО если предположение неверно, возникает дополнительная проблема. Закрывающая круглая скобка, которую вы повторяете, будет восприниматься пакетным синтаксическим анализатором как закрывающая круглая скобка текущего блока. Чтобы избежать этого, вам нужно экранировать (с точки зрения пакетного парсера) закрывающую скобку.

(
....
>>"try.xyz" echo Item.Subject = Replace(Item.Subject, """", "-"^)
....
)
person MC ND    schedule 22.03.2017