我目前正在将一些 shell 文件转换为 python,以便向 Windows 添加相同的功能。 我仅限于使用 python 和批处理命令,而不是 powershell,因为这是仅使用这两个命令的更大程序的一部分。
所以我正在寻找相当于 bash 命令的批处理
ps aux | grep foo | grep -v grep
。
我已经尝试过
tasklist /v | findstr foo
.
这似乎可行,但打印此内容的原因是为了查看当前正在运行的所有进程,并且任务列表命令会在几个参数后截断命令。
例如。如果 ps aux | 的操作grep foo | grep -v grep 如下:
root 1599162 0.0 0.0 9040 2500 pts/20 <doesnt matter> 03:47 0:00 foo <param1> <param2> <param3> ....
**<last param passed to foo>
**
任务列表 /v | findstr foo 在 Windows 中给出以下输出:
foo.exe 7624 RDP-Tcp#1 2 10,852 K Unknown <user loginID> 0:00:00 foo.exe <param1> <param2> <param3>
(第三个或第四个参数直到最后一个都不会打印。这些是区分运行命令所需的重要参数)。
#1 我们如何获取当前正在运行的完整的未截断的命令? 另外 #2 任务列表是否列出在不同命令提示符下运行的进程。
按照 Robert 对 wmi 的评论,探索了 wmic 和 python wmi 模块。 尽管已弃用,但 wmic 对我有用,我发现它非常适合替换
ps aux | grep foo | grep -v grep
。 将上面的命令替换为以下命令:
"C:\Windows\System32\wbem\WMIC.exe" process get Name,ProcessId,CommandLine,CreationDate /FORMAT:TABLE | C:\Windows\System32\findstr "foo CommandLine" | C:\Windows\System32\findstr /V "wmic findstr cmd.exe python"
最后一个 findtsr /V 被添加,因为还显示了其他要被消除的结果。 结果类似于以下内容:
CommandLine CreationDate Name ProcessId
foo <params-list> 20240215010001.243056-480 foo.exe 4972
foo <params-list> 20240215010004.237062-480 foo.exe 7424
foo <params-list> 20240215010007.237142-480 foo.exe 7084
foo <params-list> 20240215010010.237401-480 foo.exe 9016
虽然间距比我想要的有点小,但命令行后面有很多额外的空格