Войти

Показать полную графическую версию : Экранирование кавычек


pogo
09-10-2015, 16:28
Добрый день.

Есть скрипт, который ищет в почтовом ящике пользователя письмо по параметрам.
Параметры для поиска письма берутся из 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
$s = '(Сервер: "Server1") (Задание:"Start1")'
$s -replace [Char]34, '\"'
Что за, простите, ерунда?
$query = "subject:" + "'" + $message.MessageSubject + "'" + " " + "from:"...
Какбэ...
$query = "subject:'" + $message.MessageSubject + "' from:'" ...

pogo
09-10-2015, 16:48
проблема в том, что тема письма может быть любой, это я привел как один из примеров, на котором кавычки сломали запрос.
Так что вариант ручной записи строки в переменную $s = '(Сервер: "Server1") (Задание:"Start1")' не подходит.

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

greg zakharov
09-10-2015, 16:54
Причем здесь запись в переменную? '(Сервер: "Server1") (Задание:"Start1")' -replace [Char]34, '\"' Неужно так трудно в хосте посмотреть результат?

pogo
12-10-2015, 11:17
Подскажите, как можно модифицировать запись
$s = '(Сервер: "Server1") (Задание:"Start1")'
$s -replace [Char]34, '\"'
Так, что бы не только двойные кавычки экранировались, но и другие спец символы, такие как одинарные кавычки, $, %, & ?

Foreigner
12-10-2015, 12:36
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
Коды я в таблице нашёл, а как их в -replace засунуть, что-то пока не соображу.
Или может подскажете как должен выглядеть конечный запрос код.

Foreigner
12-10-2015, 13:02
pogo, Выше показали... Если правильно понял:


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

Iska
12-10-2015, 18:12
Foreigner, может сразу одним regexp'ом?

Kazun
12-10-2015, 19:23
-replace "(\""|'|\$|%|&|\?)",'\$1'

Foreigner
12-10-2015, 19:53
или так:

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

pogo
13-10-2015, 12:16
-replace "(['`"$%&])",'\$1 »

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

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

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




© OSzone.net 2001-2012