获取当前 运行 终端的 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"
我需要获取每个打开的终端的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"