我在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不能用红色表示):
答案 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