如何在PowerShell或C#中获取进程的命令行信息


74

例如:如果我跑步notepad.exe c:\autoexec.bat

我怎样才能c:\autoexec.batGet-Process notepadPowerShell中?

或者我怎样才能c:\autoexec.batProcess.GetProcessesByName("notepad");C#中?


也许这会对您有所帮助:如何从其他进程中获取命令行参数
Corak

还不清楚。您能更清楚地说明您要做什么吗?@victorwoo
Rezoan 2013年

1
请退后一步,描述您要解决的实际问题,而不是您认为是解决方案的问题。
Ansgar Wiechers 2013年

如果我们已经启动了一个进程并传递了一些参数,那么如何通过C#或PowerShell获取正在运行的进程的命令行参数?
victorwoo

Answers:


126

在PowerShell中,您可以通过WMI获取进程的命令行:

$process = "notepad.exe"
Get-WmiObject Win32_Process -Filter "name = '$process'" | Select-Object CommandLine

请注意,您需要管理员权限才能访问有关在另一个用户的上下文中运行的进程的信息。作为普通用户,只有在您自己的上下文中运行的进程才对您可见。


6
也有一个权限方面。Powershell进程需要具有至少等同于目标进程的权限。因此,常规Powershell会话将无法获得运行提升的进程(例如,管理员)的此类信息。在这种情况下,CommandLine(响应)将为空白。
CJBS 2014年

3
@CJBS确切地说,您需要管理员权限才能访问有关在另一个用户的上下文中运行的进程的信息。作为普通用户,只有在您自己的上下文中运行的进程才对您可见。
Ansgar Wiechers 2014年

2
该值仍然被截断为一定长度的字符。您可以通过将结果传递给“ out-string -Width 2000”或类似内容来解决此问题。
香农

7
@mbrownnyc using-Filter如果在Get-WmiObject远程计算机上运行(使用-ComputerName参数),则会在远程主机上进行过滤,从而减少了通过网络传输的数据量(从而提高了性能)。从远程主机获取所有WMI数据Where-Object后,在本地使用筛选器。但是,像在这种情况下一样,在本地运行时没有什么区别。另请注意,该语法仅在PowerShell v3或更高版本中有效。在此之前,您必须使用。Get-WmiObjectwhere property <op> valuewhere { $_.property <op> value }
Ansgar Wiechers,2015年

3
这并不需要花太多时间,但是可以节省一些按键操作,如果您已经有了进程ID(例如查看CPU使用情况等),您可以使用"processid = 1234"-我用它来查看哪个网站正在流氓我们的服务器(有200个w3wp.exe进程)
ahwm

38

这个答案是很好的,但是对于将来的证明以及对您的帮助,对您来说是一个好处,除非您使用的是很老的Powershell(在这种情况下,我建议您进行更新!)Get-WMIObject已被Get-CimInstance取代嘿,脚本专家参考

尝试这个

$process = "notepad.exe"
Get-CimInstance Win32_Process -Filter "name = '$process'" | select CommandLine 

6
请注意,带有Get-CimInstance Win32_Processname包括.exe扩展名。与有所不同Get-Process
Ross Presser

0

我使用的是Powershell 7.1,它现在似乎已作为脚本属性内置到流程对象中:

> (Get-Process notepad)[0].CommandLine
"C:\WINDOWS\system32\notepad.exe"

有趣的是,您可以查看其实现,并看到它部分地使用了PsychoData的答案:

($process | Get-Member -Name CommandLine).Definition
System.Object CommandLine {get=
                        if ($IsWindows) {
                            (Get-CimInstance Win32_Process -Filter "ProcessId = $($this.Id)").CommandLine
                        } elseif ($IsLinux) {
                            Get-Content -LiteralPath "/proc/$($this.Id)/cmdline"
                        }
                    ;}

在进程上运行Get-Member表示它是System.Diagnostics.Process的实例,但是它具有多个已编写脚本的属性。

其他属性是FileVersion,Path,Product和ProductVersion。

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.