Двойная обратная косая черта в PowerShell WMI/WQL-запросов
Я столкнулся со странной проблемой с моим WQL-запросом.
$SCCMQuery = @'
Select UAR.User, UAR.Application, UAR.CurrentState from sms_fullcollectionmembership as FCM
INNER JOIN SMS_UserApplicationRequest as UAR ON UAR.User=FCM.SMSID
where FCM.CollectionID="a\100104"
'@
$Results = Get-WmiObject -Namespace "root\SMS\Site_Name" -Query $SCCMQuery
Вышеупомянутый запрос не работает должным образом, но когда я добавляю еще одну обратную косую черту в FCM.CollectionID
как это(a\\100104
) тогда это начинает работать.
Может кто-нибудь, пожалуйста, сообщите мне, почему это работает так? Я не могу вручную поставить обратную косую черту во всех значениях, так как они будут позже сгенерированы из другого запроса WMI.
2 ответа
Если вы посмотрите на about_wql, вы увидите, что
WQL использует обратную косую черту () в качестве escape-символа. Это отличается от Windows PowerShell, в которой используется символ обратной галочки (`).
В ваших сгенерированных запросах вы можете просто искусственно добавить косую черту с простой заменой, если хотите.
$SCCMQuery.replace("\","\\")
я уверен, что $SCCMQuery
Это был всего лишь пример тестирования, но запрос должен быть размещен где-то в коде.
Даже если \
это просто буквальный символ в PowerShell, это все еще escape-символ в WQL.
Из спецификации:
WQL использует терминологию и понятия, как указано в [DMTF-DSP0004], за исключением случаев, указанных ниже, и требует знакомства с моделью CIM. Сервер ДОЛЖЕН обрабатывать обратную косую черту как escape-символ в запросе WQL, кроме как в предложении LIKE. Сервер ДОЛЖЕН обрабатывать литеральные строки в данных WQL без учета регистра, в отличие от того, что указано в [DMTF-DSP0004].
Использование можно использовать -replace
оператор, чтобы избежать обратной косой черты (имейте в виду, что первый аргумент -replace
шаблон регулярного выражения, который также обрабатывает обратную косую черту как escape-символ):
$escapedWmiQueryValue = $WmiQueryValue -replace '\\','\\'