WMIC + Python 子进程/ (Windows 10)
Posted
技术标签:
【中文标题】WMIC + Python 子进程/ (Windows 10)【英文标题】:WMIC + Python Subprocess/ (Windows 10) 【发布时间】:2020-11-15 19:00:24 【问题描述】:我正在尝试使用 subprocess.Popen 杀死一个 .exe。
解决方案为:
-
taskkill /im (.exe) /t /f
taskkill /pid (.exe) /t /f
无法正常工作,因为响应被拒绝访问。事实上,当我从子进程运行 cmd 时,我无法获得管理员权限。
我找到了一个从 cmd 中杀死这个进程的命令(不以管理员身份运行),它是:
-
wmic process where name=".exe" 删除
...但是当我使用子进程运行它时,它给了我“无效查询”。 我正在运行的命令是:
4)subprocess.Popen(['wmic', 'process', 'where', 'name="-------.exe"', 'delete'], shell=True, stdout=subprocess .管道)
我想我写错了。有什么建议吗?
【问题讨论】:
尝试删除文件名周围的引号,因为无论如何您都在此处指定单独的参数。这行得通吗? 听起来像是一些奇怪的逃避不兼容...在黑暗中拍摄,可能不是最好的解决方案:['cmd', '/c', 'wmic process where name="open***.exe" delete']
或者只是将整个事情作为字符串传递:subprocess.popen('wmic process where name="open***.exe" delete')
接下来我要做的是使用Process Monitor 来查看实际上传递给 wmic 的命令行(将过滤器设置为“操作”“以”“进程”开头)并将其与您从 cmd 工作时的外观进行比较。这可能会提供有关问题所在的线索。
哦,酷。在这种情况下,如果您能针对自己的问题写一个答案,那就太好了,这样未来的读者也可以找到解决方案!您以后也可以自行接受答案。
您不应将参数列表与shell=True
混合使用;它有时会以奇怪的方式工作,但基本上总是一个错误。另见***.com/questions/3172470/…
【参考方案1】:
解决方案是在比较运算符周围放置空格并将整个条件(name = xxx
或 name like xxx
)作为单个参数发送,因为 wmic 不喜欢将其分成几部分,并且在内部引号会弄乱如果它们位于单词的“中间”,则向上:
subprocess.Popen(['wmic', 'process', 'where', 'name like "----.exe"', 'delete'], shell=True)
【讨论】:
实际上 shell=False 和 shell=True 都有效。我是新手,不知道 shell=True 可能引起的并发症。有什么解释吗?例如,当我使用子进程的正确命令启动 .exe 时,它需要 shell=True 否则会发生错误。相反,当使用 wmic if shell =False 时,不会出现错误。 我的其他评论有一个指向更多信息的链接。基本上,这目前恰好适用于 Windows,但这并不意味着它是正确的;一旦你阅读了链接页面,你应该很清楚为什么不这样做。 它是“wmic.exe”,而不是wmic
shell 命令,并且您没有使用任何 shell 命令行功能,例如环境变量扩展或标准 I/O 重定向和管道,所以在这里使用shell=True
是没有意义的。
此命令仅适用于 Windows,因此无需担心 wmic.exe 是否与subprocess.list2cmdline
中的假设兼容。实际上,wmic.exe 调用GetCommandLineW
并手动解析其命令行,而不是使用C argv
或CommandLineToArgvW
,因此与将参数作为列表传递可以预见的兼容并不是一种正常情况。只需使用命令行字符串,例如subprocess.call('wmic.exe process where "name like "----.exe"" delete')
.
更简单地说,通过 PID 通过os.kill(pid, signal.SIGTERM)
终止进程。在 Windows 中,这是通过 TerminateProcess(hProcess, SIGTERM)
实现的,它将退出状态设置为 SIGTERM
(15)。这不是 Windows 中有意义的退出状态,但很好。通常在 Windows 中,终止进程的退出状态设置为 1,但 os.kill
写得非常糟糕,并将其与尝试将 CTRL_BREAK_EVENT
(1) 发送到控制台组混为一谈,给定 ID 被解释为控制台进程组标识。仅当它实际上是您发送 Ctrl+Break 的控制台进程组时才执行此操作。以上是关于WMIC + Python 子进程/ (Windows 10)的主要内容,如果未能解决你的问题,请参考以下文章