2015-07-09 6 views
3

Я столкнулся со странной проблемой с моим WQL-запросом.двойная обратная косая черта в WMI/WQL query powershell

$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.

ответ

3

Если вы посмотрите на about_wql вы увидите, что

WQL uses the backslash() as its escape character. This is different from Windows PowerShell, which uses the backtick character (`).

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

$SCCMQuery.replace("\","\\") 

Я уверен, что $SCCMQuery был просто пример тестирования, но запрос должен быть помещен в коде где-нибудь.

+0

Да, вы правильно выше запроса - это всего лишь пример. Не могли бы вы привести мне несколько примеров. – Ironic

+0

@ 404 Это зависит от того, какой источник запроса и как вы планируете его вставлять. – Matt

+0

a \ 100104 также поступает из запроса WMI. Когда я вывожу это значение. Это дает мне \ 100104. Теперь я должен передать его другому WQL. – Ironic

3

Несмотря на то, что \ является буквальным символом в PowerShell, он по-прежнему является символом выхода в WQL.

От the specification:

WQL uses terminologies and concepts, as specified in [DMTF-DSP0004] , except as noted below, and requires familiarity with the CIM model. The server MUST treat a backslash as an escape character in a WQL query, except within a LIKE clause. The server MUST treat literal strings in WQL data as case-insensitive, contrary to what [DMTF-DSP0004] specifies.

Использование можно использовать оператор -replace, чтобы избежать обратной косой черты (следует помнить, что первый аргумент -replace является шаблоном регулярного выражения, который также относится к обратной косой черты в качестве экранирующего символа):

$escapedWmiQueryValue = $WmiQueryValue -replace '\\','\\' 
+0

Но я помещаю значение в цитату как это 'a \ 100104' или "a \ 100104". Есть все равно, чтобы достичь. – Ironic

+1

PowerShell не заботится о косой черте в этом случае ... WQL заботится независимо от – Matt

+0

@ 404 Одиночные кавычки не позволяют синтаксическому анализатору PowerShell интерпретировать значение так или иначе, это поставщик WMI, который «неправильно понимает» вас –