【问题标题】:double backslash in WMI/WQL query powershellWMI/WQL 查询 powershell 中的双反斜杠
【发布时间】:2015-07-09 17:31:10
【问题描述】:

我的 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 查询生成。

【问题讨论】:

    标签: powershell wmi wql


    【解决方案1】:

    如果您查看about_wql,您会看到

    WQL 使用反斜杠 () 作为其转义 特点。这与 Windows 不同 PowerShell,它使用反引号 字符 (`)。

    如果需要,您可以在生成的查询中通过简单的替换人为地添加斜线。

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

    我确信$SCCMQuery 只是一个测试示例,但查询必须放在代码中的某个位置。

    【讨论】:

    • 是的,你是对的,上面的查询只是一个例子。你能给我一些关于这方面的例子吗?
    • @404 这取决于查询的来源是什么以及您打算如何插入它。
    • a\100104 也来自 WMI 查询。当我输出这个值时。它给了我一个\ 100104。现在我必须将它传递给另一个 WQL。
    • @404 如果是这样,我不明白为什么我和 Mathias 的建议行不通。 $resultofFirstQuery.replace("\","\\")。如果您对此处的字符串使用双引号,那么您可以直接在查询中添加变量
    • 它工作得很好,但我遇到了一个错误。异常设置“CurrentState”:“无法将值“Pending”转换为类型“System.UInt32”。错误:“输入字符串格式不正确。”
    【解决方案2】:

    尽管\ 在 PowerShell 中只是一个文字字符,但在 WQL 中它仍然是一个转义字符

    来自the specification

    WQL 使用[DMTF-DSP0004] 中指定的术语和概念, 除非如下所述,并且需要熟悉 CIM 模型。 服务器必须将反斜杠视为 WQL 查询中的转义字符,LIKE 子句中除外。服务器必须处理文字 WQL 数据中的字符串不区分大小写,这与什么相反 [DMTF-DSP0004] 指定。

    使用可以使用-replace 运算符来转义反斜杠(注意-replace 的第一个参数是一个正则表达式模式,它也将反斜杠视为转义字符):

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

    【讨论】:

    • 但我将值放在引号中,例如“a\100104”或“a\100104”。有没有办法实现。
    • PowerShell 在这种情况下不关心斜线... WQL 不关心
    • @404 单引号只会阻止 PowerShell 解析器以一种或另一种方式解释值,它是 WMI 提供程序“误解”了你
    • 好的。感谢您的澄清。当前用户 id 是这样的 a\100104。我将不得不通过 where 子句传入 WMI。我无法从中删除反斜杠。我需要找到一种方法,WMi 可以理解它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 2012-02-10
    • 2012-06-16
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多