为什么ProcessStartInfo的参数为空?

时间:2017-06-13 00:33:53

标签: windows powershell

当我尝试获取可执行文件的命令行参数时,我尝试检查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实用程序可以获得完整的命令行:

enter image description here

另外,正如评论指出的那样,使用win32 wmi对象接口可以得到它。但是,为什么PowerShell缺少此功能?

1 个答案:

答案 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中找到数据,当进程开始时,它可以追加它。