繁体   English   中英

Powershell - 在 CMD 上运行命令 - 通配符抛出错误

[英]Powershell - Running Command on CMD - Wildcards Throw Error

我正在尝试通过 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 命令行的进程

更简单,不需要 PowerShell

wmic process where "commandline like '%c:\\windows\\test%'" get name, commandline

为了完整起见,为了保持正确的主题,使用 cmd.exe 中的 PowerShell,我会更像这样:

powershell -noprofile "get-ciminstance -query \"select * from win32_process where commandline like '%c:\\windows\\test%'\" | select-object -property processname, commandline"

Compo 有用的wmic解决方案比调用 Windows PowerShell CLI ( powershell.exe ) 更简单、更高效,但值得注意的是:

  • wmic.exe CLI 已被弃用,正如WMIC is deprecated.所证明的那样WMIC is deprecated. 从 Windows 10 20H2 开始,当您调用其命令行帮助 ( wmic /? ) 时以红色打印; 然而,奇怪的是,文档没有提到弃用。 也就是说, wmic.exe可能不会消失。

  • 然而,毫无疑问,从 PowerShell内部CIM cmdlet(例如Get-CimInstance )更可取[1]尤其是因为它们返回丰富的对象,而不仅仅是文本


至于你尝试什么

  • 你的命令的工作从cmd.exe (,相反,PowerShell的,因为里面的PowerShell你需要`""" -不是\\" -嵌入"在字符"..."的字符串)

  • 唯一的问题是执行Get-WmiObject调用的powershell.exe进程总是包含在搜索结果中,因为它本身包含搜索词。

因此,唯一需要的调整是使用自动$PID变量从结果中排除powershell.exe进程本身,该变量反映了会话自己的进程 ID:

  • 注意:由于上述原因,我使用的是Get-CimInstance而不是Get-WmiObject 请注意添加Where-Object ProcessId -ne $PID管道段。
powershell -c "Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -like \"*C:\Windows\Test*\" } | Where-Object ProcessId -ne $PID | Select-Object ProcessName, CommandLine"

稍微更有效的替代方案是将过滤器在WMI源,使用Get-CimInstance-Filter参数,它接受一个(部分) WQL查询(请注意使用的%作为通配符,并需要字面\\实例;作为副作用,不再需要Where-Object ProcessId -ne $PID过滤器):

powershell -c "Get-CimInstance Win32_Process -Filter 'CommandLine like \"%C:\\Windows\\Test%\"' | Select-Object ProcessName, CommandLine"

[1] CIM cmdlet(例如Get-CimInstance )取代了 PowerShell v3(2012 年 9 月发布)中的 WMI cmdlet(例如Get-WmiObject )。 因此,应该避免使用 WMI cmdlet,尤其是因为 PowerShell (Core) (v6+)(未来所有工作将在其中进行)甚至不再拥有它们。 但是请注意,WMI 仍然是 CIM cmdlet 的基础。 有关更多信息,请参阅此答案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM