我在某个地方对 wmi 查询进行了错误的转义,有人可以帮助修复它吗?因为它显示无效查询
string deviceid = "Disk #0, Partition #0";
string antecedent = @"\\" + Environment.MachineName + "\\root\\cimv2:Win32_DiskPartition.DeviceID=\"" + deviceid + "\"";
ManagementObjectSearcher assosiaciation_query2 = new ManagementObjectSearcher("select Dependent from Win32_LogicalDiskToPartition where Antecedent = \"" + antecedent + "\"");
foreach (ManagementObject assosiaciation_query_data2 in assosiaciation_query2.Get())
{
Console.WriteLine("Dependent: " + assosiaciation_query_data2["Dependent"]);
}
谢谢你。
好吧,因为在mysql中你可以使用LIKE来查找类似的表,我也读到这是可能的https://msdn.microsoft.com/en-us/library/aa392263%28v=vs.85%29.aspx?f =255&MSPPError=-2147217396在wmi查询中使用LIKE
string deviceid = "Disk #0, Partition #0"; ManagementObjectSearcher assosiaciation_query2 = new ManagementObjectSearcher("select Dependent from Win32_LogicalDiskToPartition where Antecedent LIKE '%" + deviceid + "%'");
所以仍然显示查询无效
您将 2 个双引号放入另外 2 个双引号中,这破坏了您的代码。您应该在先行字符串中使用 WMI 转义代码:
string antecedent = @"\\" + Environment.MachineName + "\\root\\cimv2:Win32_DiskPartition.DeviceID=\\\"" + deviceid + "\\\"";
当 WMI 收到命令时,应该是这样的:
\“您的设备ID\”
插入 2 个顶点应该可以正常工作:) 示例:
Mycommand"myOtherCommand\"myvalue\""
编辑:
我完全误解了你的目标,抱歉,你的查询中有一个错误,因为“#”是 MySQL 通配符,它会扰乱你的查询(是 MySql 内联注释),
不,即使我使用像'aaa'这样的where Ascendent,它也不起作用,我不知道为什么你的where条件搞乱了代码:/.
如果您使用以下代码,它就可以工作:
string query = "select * from Win32_LogicalDiskToPartition";
string antecedent = @"\\" + Environment.MachineName + "\\root\\cimv2:Win32_DiskPartition.DeviceID=\"" + deviceid + "\"";
ManagementObjectSearcher moSearch = new ManagementObjectSearcher(query);
ManagementObjectCollection moCollection = moSearch.Get();
foreach (ManagementObject mo in moCollection)
{
if (string.Equals(mo["Antecedent"].ToString(), antecedent))
Console.WriteLine("Dependent: " + mo["Dependent"]);
}
public static string Mtd_GetDriveLetterWithLabel(string DriveLabel)
{
ManagementObjectSearcher DriveLabelQuery = new ManagementObjectSearcher(" SELECT * FROM Win32_Volume WHERE Label = '" + DriveLabel + "' ");
string DriveLetter = "";
foreach (ManagementObject DriveLabels in DriveLabelQuery.Get())
{
DriveLetter = DriveLabels["DriveLetter"].ToString();
}
return DriveLetter;
}
public static int Mtd_GetDiskNumberWithLetter(string DriveLetter)
{
ManagementObjectSearcher DriveLetterGeneralQuery = new ManagementObjectSearcher("SELECT * FROM Win32_LogicalDiskToPartition");
ManagementObjectCollection DriveLetterCollection = DriveLetterGeneralQuery.Get();
string Dependent = @"\\" + Environment.MachineName + "\\root\\cimv2:Win32_LogicalDisk.DeviceID=\"" + DriveLetter + "\"";
String DiskNumberTxt = "";
foreach (ManagementObject DiskNumbers in DriveLetterCollection)
{
if ((DiskNumbers["Dependent"].ToString()) == Dependent)
{
DiskNumberTxt = DiskNumbers["Antecedent"].ToString();
}
}
int From = DiskNumberTxt.IndexOf("Disk #") + "Disk #".Length;
int To = DiskNumberTxt.IndexOf(",");
String DiskNumberTrim = DiskNumberTxt.Substring(From, To - From);
int DiskNumber = Int32.Parse(DiskNumberTrim);
return DiskNumber;
}
public static string Mtd_GetSerialNumberWithDiskNumber(int DiskNumber)
{
ManagementObjectSearcher SerialNumberQuery = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia");
ManagementObjectCollection SerialNumberCollection = SerialNumberQuery.Get();
string Tag = @"\\.\PHYSICALDRIVE" + DiskNumber;
String SerialNumberTxt = "";
foreach (ManagementObject SerialNumbers in SerialNumberCollection)
{
if ((SerialNumbers["Tag"].ToString()) == Tag)
{
SerialNumberTxt = SerialNumbers["SerialNumber"].ToString();
}
}
return SerialNumberTxt;
}
使用------------------------------------------------ --------------------
字符串 DriveLabel = "DATA";
字符串 DriveLetter = Mtd_GetDriveLetterWithLabel(DriveLabel); Console.WriteLine(DriveLetter);
int DiskNumber = Mtd_GetDiskNumberWithLetter(DriveLetter); Console.WriteLine(磁盘编号);
string DiskSerialNumber = Mtd_GetSerialNumberWithDiskNumber(DiskNumber); Console.WriteLine(磁盘序列号);