我正在尝试通过CMD运行以下Powershell命令:
powershell -command "Get-WmiObject Win32_Process | Where-Object {$_.CommandLine -like \"*C:\Windows\Test*\" } | Select-Object ProcessName, CommandLine"
字符串
上面的命令直接在Powershell上运行良好,但只有当我尝试在CMD上运行它时才会出现问题。在我的测试中,我发现 * 符号无法正确处理,我试图在符号之前放置一个反斜杠进行测试,但没有成功。有没有办法让它在CMD中使用 * 符号?
**编辑:**此命令用于查看包含C:\Windows\Test命令行的进程
2条答案
按热度按时间mkshixfv1#
更简单的是,* 不需要PowerShell*:
字符串
为了完整起见,为了正确地保持主题,使用PowerShell从Roll.exe,我会这样做:
型
7lrncoxx2#
Compo's helpful
wmic
solution比调用Windows PowerShell CLI(powershell.exe
)更简单、更高效,但值得注意的是:***
wmic.exe
CLI * 已被弃用 *,从Windows 10 20 H2调用其命令行帮助(wmic /?
)时,WMIC is deprecated.
以红色打印也可以证明这一点。也就是说,wmic.exe
可能不会消失。Get-CimInstance
)是更好的,[1]不仅仅是因为它们返回丰富的 * 对象 * 而不仅仅是 * 文本 *。至于你尝试了:
*您的命令 does work from
cmd.exe
(相反,does not from PowerShell,因为在PowerShell中,您需要``"或
""-而不是
"-将
"字符嵌入
"..."`字符串)Get-WmiObject
调用的powershell.exe
进程 * 总是包含在搜索结果中 *,因为它本身包含搜索项。因此,**唯一需要的调整是 * 从结果中排除
powershell.exe
进程本身 *,使用自动$PID
变量,它反映了会话自己的进程ID:Get-CimInstance
而不是Get-WmiObject
。注意添加的Where-Object ProcessId -ne $PID
管道段。字符串
一个稍微更有效的替代方法是在
Get-CimInstance
的-Filter
参数中 *filter在\
的源代码中 *,该参数接受WQL查询的(部分)(注意%
作为\
字符的使用,以及需要 double literal\
示例;作为副作用,Where-Object ProcessId -ne $PID
过滤器不再需要):型
[1]CIM小插件(例如,
Get-CimInstance
)取代了小程序(例如,Get-WmiObject
)在PowerShell v3中(2012年9月发布)。因此,应该避免使用CIM小工具,尤其是因为PowerShell(Core)(v6+),未来所有的工作都将在那里进行,甚至不再有它们。请注意,CIM小工具仍然是CIM小工具的基础,有关详细信息,请参阅this answer。