例如:如果我运行notepad.exe c:\autoexec.bat,如何在PowerShell中获取Get-Process notepad中的c:\autoexec.bat?或者我如何在C#中得到Process.GetProcessesByName("notepad");中的c:\autoexec.bat?
notepad.exe c:\autoexec.bat
Get-Process notepad
c:\autoexec.bat
Process.GetProcessesByName("notepad");
weylhg0b1#
在PowerShell中,您可以通过WMI获取进程的命令行:
$process = "notepad.exe" Get-WmiObject Win32_Process -Filter "name = '$process'" | Select-Object CommandLine
请注意,您需要管理员权限才能访问有关在另一个用户的上下文中运行的进程的信息。作为一个普通用户,它只对在您自己的上下文中运行的进程可见。
u3r8eeie2#
这个答案是优秀的,但是为了未来,做未来的你一个忙,除非你使用相当旧的powershell(在这种情况下,我建议更新!)Get-WMIObject已被Get-CimInstance Hey Scripting Guy reference取代试试这个
$process = "notepad.exe" Get-CimInstance Win32_Process -Filter "name = '$process'" | select CommandLine
xiozqbni3#
如果将以下代码放入PowerShell $PROFILE文件中,则可以永久扩展Process对象类并使用CommandLine属性:
$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
注意: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你有正确的权限,对于查询到的进程,参见1(https://stackoverflow.com/a/17582576/9156059),2(https://social.technet.microsoft.com/Forums/lync/en-US/5eb197e2-aeeb-4eb6-9e5b-9f90966e5d79/win32process-commandline-returning-blank-while-im-not-an-admin?forum=ITCG)):
Update-TypeData
-ErrorAction Ignore
-EA Ignore
$IsWindows
(([System.Diagnostics.Process]@{}) | gm | ? { $_.Name -ieq 'commandline' }) | select -expand Definition
get-process notepad.exe | select-object ProcessName, CommandLine
6tdlim6h4#
我使用的是powershell7.1,这似乎是作为脚本属性内置到process对象中的:
> (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。
4条答案
按热度按时间weylhg0b1#
在PowerShell中,您可以通过WMI获取进程的命令行:
请注意,您需要管理员权限才能访问有关在另一个用户的上下文中运行的进程的信息。作为一个普通用户,它只对在您自己的上下文中运行的进程可见。
u3r8eeie2#
这个答案是优秀的,但是为了未来,做未来的你一个忙,除非你使用相当旧的powershell(在这种情况下,我建议更新!)Get-WMIObject已被Get-CimInstance Hey Scripting Guy reference取代
试试这个
xiozqbni3#
如果将以下代码放入PowerShell
$PROFILE
文件中,则可以永久扩展Process
对象类并使用CommandLine
属性:注意:
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你有正确的权限,对于查询到的进程,参见1(https://stackoverflow.com/a/17582576/9156059),2(https://social.technet.microsoft.com/Forums/lync/en-US/5eb197e2-aeeb-4eb6-9e5b-9f90966e5d79/win32process-commandline-returning-blank-while-im-not-an-admin?forum=ITCG)):
6tdlim6h4#
我使用的是powershell7.1,这似乎是作为脚本属性内置到process对象中的:
有趣的是,你可以查看它的实现,并看到它部分使用了PsychoData的答案:
对进程运行Get-Member表明它是System.Diagnostics.Process的示例,但它有几个脚本化的属性。
其他属性是FileVersion、Path、Product和ProductVersion。