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

问题描述 投票:0回答:4

例如:如果我运行

notepad.exe c:\autoexec.bat

如何在 PowerShell 的

c:\autoexec.bat
中获取
Get-Process notepad

或者我怎样才能在 C# 的

c:\autoexec.bat
中获得
Process.GetProcessesByName("notepad");

c# powershell process command
4个回答
151
投票

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

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

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


58
投票

This answer is excellent, however for futureproofing and to do future you a favor, unless you're using pretty old powershell (in which case I recommend update!) Get-WMIObject 已被 Get-CimInstance 取代Hey Scripting Guy reference

试试这个

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

13
投票

如果将以下代码放入 powershell

$PROFILE
文件中,您可以永久扩展
Process
对象类并使用
CommandLine
属性:

$TypeData = @{
    TypeName   = [System.Diagnostics.Process].ToString()
    MemberType = [System.Management.Automation.PSMemberTypes]::ScriptProperty
    MemberName = 'CommandLine'
    Value = {
        if (('Win32NT' -eq [System.Environment]::OSVersion.Platform)) { # it's windows
            (Get-CimInstance Win32_Process -Filter "ProcessId = $($this.Id)").CommandLine
        } elseif (('Unix' -eq [System.Environment]::OSVersion.Platform)) { # it's linux/unix
            Get-Content -LiteralPath "/proc/$($this.Id)/cmdline"
        } elseif (('MacOSX' -eq [System.Environment]::OSVersion.Platform)) { # it's macos
            # ???
        }
    }
}
Update-TypeData @TypeData -ErrorAction Ignore

NB:

Update-TypeData
是用
-ErrorAction Ignore
调用的,因为在 pwsh 中(至少在版本 7.3.4 上),
CommandLine
已经存在;
-EA Ignore
抑制错误。作为替代方案,您可以检查属性是否存在,并仅在缺少属性的情况下执行
Update-TypeData

用作值的脚本块取自 pwsh 7.3.4 实际上 内部使用的内容,也适用于 Windows Powershell(其中

$IsWindows
等不存在)。

您可以通过在 pwsh 7.3.4 中运行以下命令来获取脚本块中的代码:

(([System.Diagnostics.Process]@{}) | gm | ? { $_.Name -ieq 'commandline' }) | select -expand Definition
.

然后你可以可靠地查询命令行(iif你有正确的权限,对于查询的进程(es),见[1][2]):

get-process notepad.exe | select-object ProcessName, CommandLine

8
投票

我正在使用 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。

© www.soinside.com 2019 - 2024. All rights reserved.