Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Экранирование кавычек (http://forum.oszone.net/showthread.php?t=306455)

pogo 09-10-2015 16:28 2562267

Экранирование кавычек
 
Добрый день.

Есть скрипт, который ищет в почтовом ящике пользователя письмо по параметрам.
Параметры для поиска письма берутся из MessageTrackingLog

Код:

$message = Get-MessageTrackingLog -EventID "RECEIVE" -MessageID "$messageID"
$date = $message.Timestamp.ToString("dd\/MM\/yyyy")
$to = $message.Recipients -join "," # преобразовываем массив в строку
$query = "subject:" + "'" + $message.MessageSubject + "'" + " " + "from:" + $message.Sender + " " + '"' + "to:" + '"' + $to + " " + "sent:" + $date
Search-Mailbox -Identity $mailbox -SearchQuery {$query} -TargetMailbox admin -TargetFolder "test" -LogOnly -LogLevel Full

Проблема заключается в том, что если в теме письма будет, что-то типа:
Предупреждение Backup: Задание выполнено (Сервер: "Server1") (Задание:"Start1")
То эти кавычки ломают весь запрос $query.
Подскажите, как можно решить проблему? Какое-то динамическое экранирование кавычек или какое-то глобальное экранирование может быть?

greg zakharov 09-10-2015 16:42 2562273

Код:

$s = '(Сервер: "Server1") (Задание:"Start1")'
$s -replace [Char]34, '\"'

Что за, простите, ерунда?
Цитата:

Цитата pogp
$query = "subject:" + "'" + $message.MessageSubject + "'" + " " + "from:"...

Какбэ...
Код:

$query = "subject:'" + $message.MessageSubject + "' from:'" ...

pogo 09-10-2015 16:48 2562277

проблема в том, что тема письма может быть любой, это я привел как один из примеров, на котором кавычки сломали запрос.
Так что вариант ручной записи строки в переменную
Код:

$s = '(Сервер: "Server1") (Задание:"Start1")'
не подходит.

P.S. Поясните пожалуйста, что делает вторая приведенная вами строка?

greg zakharov 09-10-2015 16:54 2562278

Причем здесь запись в переменную?
Код:

'(Сервер: "Server1") (Задание:"Start1")' -replace [Char]34, '\"'
Неужно так трудно в хосте посмотреть результат?

pogo 12-10-2015 11:17 2562906

Подскажите, как можно модифицировать запись
Код:

$s = '(Сервер: "Server1") (Задание:"Start1")'
$s -replace [Char]34, '\"'

Так, что бы не только двойные кавычки экранировались, но и другие спец символы, такие как одинарные кавычки, $, %, & ?

Foreigner 12-10-2015 12:36 2562947

pogo, Сразу прописывайте вместо символов нужный номер символа:
Код:

[int[]][char[]]("$", "%", "&","'",'"')
36
37
38
39
34

Код:

$s = "(Сервер: $([char]34)Server1$([char]34)) (Задание:$([char]34)Start1$([char]34))"

pogo 12-10-2015 12:47 2562961

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

Foreigner 12-10-2015 13:02 2562969

pogo, Выше показали... Если правильно понял:

Код:

$subject = ($message.MessageSubject) -replace [char]34,'\"' -replace [char]39,"\'" -replace ......
$query = "subject:" + "'" + $subject + "'"....


Iska 12-10-2015 18:12 2563068

Foreigner, может сразу одним regexp'ом?

Kazun 12-10-2015 19:23 2563100

Код:

-replace "(\""|'|\$|%|&|\?)",'\$1'

Foreigner 12-10-2015 19:53 2563111

или так:
Код:

-replace "(['`"$%&])",'\$1'

pogo 13-10-2015 12:16 2563350

Цитата:

Цитата Foreigner
-replace "(['`"$%&])",'\$1 »

насколько я понимаю, такой вариант неприемлем, по 2 причинам
1. экранирование в ps делается не \, а `
2. что бы заэкранировать одинарные кавычки, вторая часть выражения, должны быть в двойных (, "`'"), а что бы заэкранировать двойные, она должна быть в одинарный (, '`"')
если ошибаюсь пожалуйста поправьте.

Foreigner 13-10-2015 13:14 2563374

pogo, Во всех предыдущих примерах экранирование производится обратным слешем, вы определитесь чем надо экранировать в теле отправляемого сообщения. Для меня такой задачи нет по определению, я не работаю в IT сфере (даже нет компьютера), поэтому не могу дать исчерпывающий ответ. Что касается экранирования '`' или '\' в powershell, то ситуации бывают разные. Попробуйте:
Код:

('str\ing') -split "\\"
('str\ing') -split "`\"



Время: 21:59.

Время: 21:59.
© OSzone.net 2001-