获取当前 运行 终端的 PID 并保存到变量的最快方法

Fastest way to get the PID of the current running terminal and save to a variable

我需要获取每个打开的终端的PID。

我现在有一些事情要做。但是,它没有给出正确的 PID,而且有点慢。

@echo off
rem Note: Session Name for privileged Administrative consoles is sometimes blank.
if not defined SESSIONNAME set SESSIONNAME=Console

setlocal
set instance=%DATE% %TIME% %RANDOM%
title %instance%

rem PID Find
for /f "usebackq tokens=2" %%a in (`tasklist /FO list /FI "SESSIONNAME eq %SESSIONNAME%" /FI "USERNAME eq %USERNAME%" /FI "WINDOWTITLE eq %instance%" ^| find /i "PID:"`) do set PID=%%a
if not defined PID for /f "usebackq tokens=2" %%a in (`tasklist /FO list /FI "SESSIONNAME eq %SESSIONNAME%" /FI "USERNAME eq %USERNAME%" /FI "WINDOWTITLE eq Administrator:  %instance%" ^| find /i "PID:"`) do set PID=%%a
if not defined PID echo !Error: Could not get PID of current process.  Exiting.& exit /b 1

echo Here's the PID: %PID%

我不确定如何解释它,但每当这个 运行s 时,它不会给出 cmd.exe 的 PID,但它会给出 returns 的 PID整个过程本身。因此,如果我 运行 正常 cmd,它将 return 正确的 PID,但如果我 运行 一个不同的终端,如 Cmder,它将给出 PID Cmder 的,而不是其附属 cmd.exe

我见过很多使用 for 循环和 wmic 的解决方案,但我似乎无法让它工作。每次我尝试,每次我运行它的PID它returns总是不同的,这显然是错误的。

我可以使用以下内容,它适用于第 3 方终端并且比我上面的更快:

wmic process where "name='WMIC.exe'" get parentprocessid

我只是不确定如何从这个输出中提取 PID。有没有更快的方法获取终端的 PID?

在我的评论中使用这个想法:

WMIC /OUTPUT:temp.txt Process Where "Caption='WMIC.exe'" Get ParentProcessID
For /F "Skip=1" %%A In ('Type temp.txt') Do If Not Defined PID Set "PID=%%A"
Del temp.txt
Echo=%PID%

您可以调整您的 WMIC 命令,以使用 Where "CommandLine Like… 如果您觉得有可能使用另一个 WMIC 进程 运行。不过,这可能会增加一点时间。

我假设 "each open terminal" 表示 cmd.exe 个进程。

PS C:\src\powershell> (Get-WmiObject win32_process -Filter "Name='cmd.exe'").ProcessId
6340
6204

是否需要对这些 PID 做些什么?

是的,您可以在 cmd.exe shell 脚本中使用它。

C:>powershell "(Get-WmiObject win32_process -Filter \"Name='cmd.exe'\").ProcessId"