如何找出正在运行的程序的命令行参数?


82

我正在寻找一种工具或方法来查找已将哪些命令行参数传递给程序,例如,当它由另一个程序运行时(启动器应用程序场景)。

Answers:


70

您可以使用Process Explorer来做到这一点。

只需将鼠标悬停在进程上即可查看用于启动该进程的命令行参数:
在此处输入图片说明

或者,您可以打开流程的属性并在此处检查命令行:
在此处输入图片说明


2
太棒了。
cutrightjm 2012年

2
不幸的是,它似乎不适用于受WinLicense / Themida保护的应用程序:oreans.com/winlicense.php还有其他想法吗?
Gepard 2012年

@吉帕德:你怎么知道它不起作用?您确定应用程序实际上是通过命令行参数调用的吗?不管哪种方式,PE都使用Windows的方式确定该信息。我认为,其他任何事情都必须针对特定应用进行定制。
Der Hochstapler

6
我不好,它没有使PE升高。它按预期工作。
Gepard

@OliverSalzburg,该程序如何工作?任何普通的C程序都能做到这一点吗?
Pacerier,2015年

87

您也可以使用Windows的WMI服务在没有Process Explorer的情况下进行操作。从命令提示符处运行以下命令:

WMIC path win32_process get Caption,Processid,Commandline

如果要将输出转储到文件中(使其更易于阅读),请使用/ OUTPUT开关:

WMIC /OUTPUT:C:\Process.txt path win32_process get Caption,Processid,Commandline

4
很好,你怎么知道的?
Pacerier,2015年

4
@Pacerier:我不确定是否诚实;-)我认为这是因为挖掘WMI文档并进行游戏,因为我当时需要使用WMI。
Andy E

3
您指的是哪些WMI文档?
和平者

3
这是获取正在运行的进程的命令行的非常有用的命令行方法。就我而言,我可以稍作调整以仅针对特定进程获取输出:WMIC路径win32_process,其中“ caption ='cmd.exe'”获得命令行
chriv

1
太好了,而where子句实际上支持某些SQL功能,例如,where“ name
of like'cmd

38

也可以通过使用任务管理器来实现。

打开任务管理器(通过CTRL-SHIFT-ESC,CTRL-ALT-DELETE或任何其他方法)。

对于Windows 7(可能是Windows XP):

  • 转到“进程”选项卡。在“查看”菜单上,选择“选择列...”。
  • 选中“命令行”复选框,然后单击“确定”。(您可能需要向下滚动才能找到它)

对于Windows 8:

  • 转到“详细信息”标签。右键单击任何列(例如,名称,PID等),然后选择“选择列”。
  • 选中“命令行”复选框,然后单击“确定”。(您可能需要向下滚动才能找到它)

一列“命令行”将添加到当前显示的列中。


1
我并没有真正了解@JesseBarnum,无论命令行多长时间,都可以随时调整列的大小以具有完整视图,对吗?
Jeromy Adofo

1
仅当窗口足够适合命令的大小时。如果该命令类似于具有较长类路径的Java进程,则该窗口将不适合窗口宽度。
Jesse Barnum

1
好的,谢谢。我没有问题,但我的任务管理器是可滚动的-不知道您的问题:-)。我认为,如果您可以给我发送示例程序进行尝试,那就可以解决它。
Jeromy Adofo

6
这是一个被大大低估的答案,不知道这是可能的。
Hashim

4
我在上方看到了一些有关Windows Task Manager的评论。即使您设置“命令行”列以显示带有非常长的命令行的Java进程也会被截断。但是,您可以单击任务管理器中的行,然后将整个行“复制”(Ctrl-c)并将其粘贴到文本编辑器中,以查看整个命令行(无论多长时间)。
JohnD

6

使用PowerShell进行救援。

找:

Get-WmiObject Win32_Process -Filter "name = 'perl.exe'" | where {$_.CommandLine -eq '"C:\strawberry\perl\bin\perl.exe" t/Server_PreFork.t'}

并杀死作为奖励:

Get-WmiObject Win32_Process -Filter "name = 'perl.exe'" | where {$_.CommandLine -eq '"C:\strawberry\perl\bin\perl.exe" t/Server_PreFork.t'} | ForEach-Object { Invoke-WmiMethod -Path $_.__Path –Name Terminate }

您可以直接从powershell或ps1(如果已进行系统设置)运行它。我详细介绍了我使用Powershell以及其他PowerShell技巧杀死僵尸时不受限制的脚本设置...


1
哇...鉴于问题的标题,杀死部分非常危险;)其他答案很简洁;)
汤姆(Tom

5

如果该进程已经在运行并且不会很快终止,那么使用先前的答案是很好的。但是,如果您需要这样做(就像我一样),可能进程会多次启动和/或迅速终止,或者可能会在较长时间内记录日志,因此可以使用Process Monitor来实现

基本上,它记录了系统中的各种事件,在这种情况下,我们可以只过滤“ Process Start”事件和我们要监视的进程的名称,如下所示:

在此处输入图片说明

然后,只需保持进程监视器运行,然后执行所有操作以使要记录的进程运行即可。您可以在“详细信息”列或“命令行”列中(取决于配置方式)看到命令行参数。例如:

在此处输入图片说明

当然,通过这种方式,您可以提取更多相关信息,例如什么是工作目录,在流程中传递了哪些环境变量等。此外,也很容易将结果导出到文件中。


1

使用CygWin时,如果我启动Python进程,这是命令行的示例:

c:\CygWin\bin\python2.7.exe /usr/local/bin/sudoserver.py

但是Process Explorer仅看到主要的exe文件:

进程浏览器未检测到Python进程的完整命令行

(请注意“路径:[错误打开过程消息]”(请参阅EDIT-1))。的结果相同tasklist

C:\>tasklist | find "python" /i
python2.7.exe                 5740 Console                    1    15.312 KB

因此,到目前为止我唯一知道的技巧是通过CygWin Bash shell 找到它pgrep

Luis@Kenobi /cygdrive/c/
$ pgrep -f -l server.py
5740 /usr/bin/python2.7 /usr/local/bin/sudoserver.py

只要在Windows中CygWin不会出现任何问题,知道这一点很有用,并且您可以使用它运行许多POSIX和Python程序。

编辑:在Windows中,您似乎不需要管理员权限来访问任务列表。在CygWin中,您将需要他们能够查看管理员的进程(在我看来,这更合乎逻辑:完整的命令行中可能包含诸如密码之类的一些参数),因此我们必须在提升的管理员模式下运行CygWin Bash 。

EDIT-1:如果您以管理员身份运行Process Explorer,则不会发生此问题。感谢您的指点,@ Pacerier。


2
如果您以管理员身份运行,您将不会看到[Error opening process message]
Pacerier

你是对的,@ Pacerier。太明显了,难以记住:-)。谢谢。我已经编辑了帖子以反映出来。
Sopalajo de Arrierez,2015年

-3

转到run或转到start并搜索:

tasklist -m

tasklist -svc

5
那不显示调用命令行。/m显示加载的模块(DLL等),并/svc显示每个进程中托管的服务。
Bob
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.