【问题标题】:PowerShell: Adding filter or query to Get-WmiObjectPowerShell:向 Get-WmiObject 添加过滤器或查询
【发布时间】:2018-11-14 04:54:50
【问题描述】:

我正在尝试向一行 PowerShell 代码添加过滤器或查询,但我得到了奇怪的结果。我可以使用任何 WMI 查询来复制这个问题。这是一个例子:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -command "Get-WmiObject -class Win32_Processor -Namespace root\cimv2 -filter 'Status = `"OK`"'"

这给了我这个错误:Get-WmiObject : Invalid query "select * from Win32_Processor where Status = OK"。但是如果我在已经打开的 PowerShell 窗口中运行它,像这样:

Get-WmiObject -class Win32_Processor -Namespace root\cimv2 -filter 'Status = "OK"'

效果很好。所以我不理解这种行为。我尝试了各种单引号、双引号和转义字符,但似乎没有任何效果。

【问题讨论】:

  • 您的查询语法错误:-Filter 'Name LIKE "Drivers - %"'
  • 我也用 LIKE 试过了,但没用。出于某种原因,它可以在不使用 powershell.exe -command 的情况下正常工作,但不能使用。
  • 你的说法没有任何意义。你实际上是怎么称呼它的?
  • 我把问题改成了更简单的例子。

标签: powershell wmi


【解决方案1】:

您的问题是对使用 cmd 解析器引用的误解(因为这是调用 powershell.exe 时使用的):

powershell.exe -Command ""

双引号之间的所有内容都将传递给-Command。在您的情况下,最简单的方法是转义单引号(通过加倍计数),因为 cmd 以特殊方式处理双引号(通常是通过删除它们):

powershell.exe -Command "Get-WmiObject -Class Win32_Processor -Filter 'Status = ''OK'''"

作为脚注,root/cimv2Get-WmiObject 的默认命名空间

【讨论】:

  • 我认为这是我的问题,我不知道你可以通过加倍单引号来逃避单引号。我认为您必须像使用双引号一样使用波浪号。
猜你喜欢
  • 2016-06-14
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
相关资源
最近更新 更多