【问题标题】:How can I escape a right-curly brace ( } ) in a directory name of a WMI Win32_Directory query?如何在 WMI Win32_Directory 查询的目录名称中转义右花括号 ( } )?
【发布时间】:2019-03-11 05:10:13
【问题描述】:

我正在尝试执行 WMI 查询,该查询列出了不同网络连接计算机(服务器)上目录中的所有子目录,但它失败并出现 System.Management.ManagementException“无效查询”异常。

我几乎可以肯定这个问题是由于目录名称包含左花括号和/或右花括号({})。

更新:我确定问题不是左大括号,而是右大括号。

我尝试了各种方法来逃避这些字符,但似乎没有任何效果。

下面是一个人为的例子,每次都会失败并显示“无效查询”。

using System;
using System.Management;

public static class Program
{
    public static void Main()
    {
        const string username = @"Domain\User";
        const string password = @"Password";
        const string server = @"Server";

        const string query = @"Associators of {"
                             + @"Win32_Directory.Name='"
                             + @"c:\program files (x86)\a_test}"
                             + @"'} "
                             + @"Where AssocClass = Win32_Subdirectory ResultRole = PartComponent";

        var options = new ConnectionOptions { Username = username, Password = password };
        var wmiScope = new ManagementScope(@"\\" + server + @"\root\cimv2", options);
        var wmiQuery = new ObjectQuery(query);
        var searcher = new ManagementObjectSearcher(wmiScope, wmiQuery);
        var searchResults = searcher.Get();

        foreach (var searchResult in searchResults)
        {
            var subPath = searchResult.GetPropertyValue("Name").ToString();
            var system = Convert.ToBoolean(searchResult.GetPropertyValue("System"));
            Console.WriteLine($"subPath = {subPath}; system = {system}");
        }
    }
}

不管怎样,代码运行在一台 Windows 10 机器上,查询一台 Windows 2008 R2 SP1 服务器(是的,它已计划拆除)。

谢谢!

【问题讨论】:

  • 可以this帮忙吗?
  • @vasily.sib - 您指出的问题建议使用插入符号 (^) 字符进行转义。我试过用反斜杠、正斜杠、另一个大括号、插入符号 (^) 转义大括号 - 没有用。
  • 看起来你有额外的右括号( } ),尝试注释掉查询中的第三行:+ @"'} "
  • @styx - 用于从 C# 字符串插值中转义花括号。
  • 如果你“展开”你的查询,你会得到Associators of {Win32_Directory.Name='c:\program files (x86)\a_test}'} Where AssocClass = Win32_Subdirectory ResultRole = PartComponent,你可以看到你有1个左括号和2个右括号

标签: c# wmi wmi-query wql


【解决方案1】:

这似乎是 Associators of 解析的一个怪癖。要解决此问题,请对字符串使用双引号语法而不是单引号语法(注意转义反斜杠,因为这是双引号方法所必需的):

const string query = @"Associators of {"
                     + @"Win32_Directory.Name="""
                     + @"c:\\program files (x86)\\a_test}"
                     + @"""} "
                     + @"Where AssocClass = Win32_Subdirectory ResultRole = PartComponent";

【讨论】:

  • 谢谢!我非常强烈地感觉这一定是一个解析错误,但无法正常工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
相关资源
最近更新 更多