从PowerShell启动资源管理器会返回无效的进程ID

时间:2018-01-13 18:53:30

标签: powershell pid explorer

我在PowerShell(v2)中有这个脚本:

$n = Start-Process -PassThru -FilePath "notepad.exe"
$e = Start-Process -PassThru -FilePath "explorer.exe"
$s = Start-Process -PassThru -FilePath "explorer.exe" -ArgumentList "/separate"
Write-Host "notepad pid: $($n.Id) explorer pid: $($e.Id) explorer /separate pid: $($s.Id)"

我的期望是我会在所有情况下获得正确的进程ID。但是,在执行此脚本时运行SysInternals Process Explorer,我发现记事本Start-Process在记事本的情况下返回一个有效的ID(它与Process Explorer中的相同)但是在explorer的情况下,我得到了我在Process Explorer中看不到的ID ,即使我在进程树中看到一个新进程,如果我添加“/ separate”作为参数(它的ID不匹配)。

这里有什么问题?如果我使用“/ separate”运行它,我怎样才能获得资源管理器的进程ID?

我在SO中读到了这个问题:How to get the process id of Explorer launched from Powershell 但是,这个问题没有讨论“/ separate”论证,答案也没有提供解决新流程的pid的方法。

更新

我正在使用Windows 7机器,并附上PID不匹配的图片(记事本的PID由绿色表示正常,资源管理器的PID不能用红色表示):

PowerShell and Process Explorer

1 个答案:

答案 0 :(得分:0)

所以,你没有提到你正在运行的操作系统,但这看起来像是一个环境问题。

您的代码块可以正常运行:

(Get-CimInstance -ClassName CIM_OperatingSystem).Caption
Microsoft Windows 10 Pro

$PSVersionTable.PSVersion

Major  Minor  Build  Revision
-----  -----  -----  --------
5      1      16299  98      



($n = Start-Process -PassThru -FilePath "notepad.exe")

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
27       3      772       1720       0.02   8888   1 notepad



($e = Start-Process -PassThru -FilePath "explorer.exe")

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
28       3      856       1772       0.06  14020   1 explorer



($s = Start-Process -PassThru -FilePath "explorer.exe" -ArgumentList "/separate")

Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName
-------  ------    -----      -----     ------     --  -- -----------
29       3     1004       1884       0.02   3296   1 explorer



Write-Host "notepad pid: $($n.Id) explorer pid: $($e.Id) explorer /separate pid: $($s.Id)"
notepad pid: 8888 explorer pid: 14020 explorer /separate pid: 3296

在Windows 10上使用v2模式

 Microsoft Windows [Version 10.0.17074.1000]
(c) 2017 Microsoft Corporation. All rights reserved.

C:\WINDOWS\system32>powershell -version 2
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\WINDOWS\system32> cd\
PS C:\> ($n = Start-Process -PassThru -FilePath "notepad.exe")

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
    230      14     3036      13148 ...21     0.06   1144   2 notepad


PS C:\> ($e = Start-Process -PassThru -FilePath "explorer.exe")

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
     60      10     2056       5380 ...77     0.02   6184   2 explorer


PS C:\> ($s = Start-Process -PassThru -FilePath "explorer.exe" -ArgumentList "/separate")

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id  SI ProcessName
-------  ------    -----      ----- -----   ------     --  -- -----------
     87      10     2052       5920 ...77     0.06   4672   2 explorer


PS C:\> Write-Host "notepad pid: $($n.Id) explorer pid: $($e.Id) explorer /separate pid: $($s.Id)"
notepad pid: 1144 explorer pid: 6184 explorer /separate pid: 4672
PS C:\> $PSVersionTable

Name                           Value
----                           -----
CLRVersion                     2.0.50727.8860
BuildVersion                   6.1.7600.16385
PSVersion                      2.0
WSManStackVersion              2.0
PSCompatibleVersions           {1.0, 2.0}
SerializationVersion           1.1.0.1
PSRemotingProtocolVersion      2.1