当我尝试获取可执行文件的命令行参数时,我尝试检查ProcessStartInfo
返回的Get-Process
结构,但无论如何,参数字段为空:
PS C:\> ps notepad
Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
272 15 3484 19888 0.39 33696 1 notepad
PS C:\> $(ps notepad).StartInfo
Verb :
Arguments :
CreateNoWindow : False
EnvironmentVariables : {ConEmuBaseDir, ConEmuConfig, ConEmuArgs, PROCESSOR_REVISION...}
Environment : {[ConEmuBaseDir, C:\Users\fluter\Tools\ConEmu.Core.17.1.18.0\Tools\ConEmu], [ConEmuConfig, ], [ConEmuArgs, ], [PROCESSOR_REVISION, 4501]...}
RedirectStandardInput : False
RedirectStandardOutput : False
RedirectStandardError : False
StandardErrorEncoding :
StandardOutputEncoding :
UseShellExecute : True
Verbs : {}
UserName :
Password :
PasswordInClearText :
Domain :
LoadUserProfile : False
FileName :
WorkingDirectory :
ErrorDialog : False
ErrorDialogParentHandle : 0
WindowStyle : Normal
但正如预期的那样,sysinternals套件中的procexp
实用程序可以获得完整的命令行:
另外,正如评论指出的那样,使用win32 wmi对象接口可以得到它。但是,为什么PowerShell缺少此功能?
答案 0 :(得分:1)
不确定,但@LotPing指出了答案:
$proc = Get-Process notepad
$pInfos = Get-WmiObject Win32_Process -Filter "name = '$($proc.MainModule.ModuleName)'"
$pInfos.CommandLine
CommandLine
为您提供与ProcessXP相同的信息
当此对象用于启动过程时,您会在startinfo
中找到一些内容:
$startInfo = New-Object Diagnostics.ProcessStartInfo
$startInfo.Filename = "notepad"
$startInfo.Arguments = "toto.txt"
$startInfo.UseShellExecute = $false
$Proc = [Diagnostics.Process]::Start($startInfo)
启动进程的方法很多,这个进程使用封装Win32 Process
的对象CreateProcess
。据我所知,当使用命令行时,你不会在startinfo中找到数据,当进程开始时,它可以追加它。