Пакетная конкатенация со специальными символами - PullRequest
0 голосов
/ 09 февраля 2012

Контекст

Я проверяю несколько серверов с помощью nmap и отправляю результат по электронной почте.

Я объединяю переменную с новым результатом для каждого сервера и каждого порта с этим кодом (я удалил циклы):

SET text=
SET text=!text!+"<h1>server %%i:</h1>
SET text=!text!+"Port %%a : %%b<br/>"
SET text=!text!+"<br/>"

И я отправляю одно электронное письмо с переменной text.

Рендеринг электронной почты:

server 2:

+Port 8443 : https-alt
+
+
server 3:

+Port 2103 : zephyr-clt
+Port 2105 : eklogin
+Port 2107 : msmq-mgmt
+Port 49155 : unknown
+
+

Я пытаюсь без +, но это не работает:

SET text=
SET text=!text! "<h1>server %%i:</h1>
SET text=!text! "Port %%a : %%b<br/>"
SET text=!text! "<br/>"

Я безуспешно пробую несколько альтернатив.

Вопрос

Как объединить мою text переменную без уродливого +?

Ответ, который работает

SET "text="
SET "text=!text! ^<h1^>server %%i^</h1^>^<br/^>"
SET "text=!text! Port %%a %%b^<br/^>"
SET "text=!text! ^<br/^>"
%blat% -server %server% -port %port% -f %from% -to %to% -html -s "Opened ports" -body "!text!"

Ответы [ 2 ]

4 голосов
/ 09 февраля 2012

Предпосылка вашего вопроса неверна.Оба набора кода создают текстовую переменную с сохранением специальных символов.У одного есть +, у другого нет.+ не имеет ничего общего с конкатенацией в пакетном программировании.Это просто символ, как и любой другой.

Специальные символы < и > сохраняются, потому что вы заключили их в кавычки. (На самом деле, в строке сервера отсутствует закрывающая кавычка. Но CMD.EXE оказывается прощающим. Возможно, вам следует добавить заключительную цитату, хотя для ясности.)

У вас нетбеспокоиться о существующих специальных символах внутри !text!, потому что отложенное расширение защищает специальные символы.Если бы вместо этого вы использовали %text%, то вам пришлось бы беспокоиться о специальных символах внутри значения.

Если вас беспокоит, соответствует ли текст ожидаемому, вам следует посмотреть назначение текстовой переменной, а не вывод в вашем почтовом сообщении.Добавьте код отладки, например

set text

или

echo text=[!text!]

, к своему коду, чтобы увидеть значение после его построения.(Я добавил квадратные скобки, чтобы вы могли видеть конечные пробелы.)

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

Я не понимаю, почему цитаты в вашем тексте не появляются в вашем почтовом сообщении.Опять же, после создания текста что-то должно происходить.

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

SET "text="
SET "text=!text! <h1>server %%i:</h1>"
SET "text=!text! Port %%a : %%b<br/>"
SET "text=!text! <br/>"

Обратите внимание на вступительную цитату до имя переменной.Эта форма будет сохранять специальные символы без включения кавычек в значение.

Альтернативный метод сохранения специальных символов без кавычек в значении - экранирование специальных символов.

SET text=
SET text=!text! ^<h1>server %%i:^</h1^>
SET text=!text! Port %%a : %%b^<br/^>
SET text=!text! ^<br/^>

Я думаю, чтоуказанное решение гораздо приятнее.

2 голосов
/ 09 февраля 2012
set "str1=Hello"
set "str2=World"

set "str3=%str1%%str2%"
set "str4=%str1% %str2%"

Вывод:

HelloWorld
Hello World

Не работает, потому что в ваших строках есть специальный символ (кавычки, <,>, \ и т. Д.)Вы должны использовать цитату "и удалить цитаты со следующим кодом:

:NOQUOTES
       SET _string=###%_string%###
       SET _string=%_string:"###=%
       SET _string=%_string:###"=%
       SET _string=%_string:###=%
...