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

时间:2016-11-17 14:45:26

标签: windows batch-file cmd wmic

我需要获得每个开放终端的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%

我不确定如何解释它,但无论何时运行,它都不会给出cmd.exe的PID,但它会返回整个过程本身的PID。因此,如果我运行正常的cmd,它将返回正确的PID,但如果我运行了不同的终端,如Cmder,它将给出Cmder的PID,而不是其附属的{ {1}}。

我已经看到许多解决方案使用cmd.exe循环for,但我似乎无法让它发挥作用。每次我尝试它时,每次运行时它返回的PID总是不同的,这显然是错误的。

我可以使用以下内容,它可以与第三方终端配合使用,并且比我上面的更快:

wmic

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

2 个答案:

答案 0 :(得分:2)

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

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进程正在运行,您可以调整WMIC命令,以使用Where "CommandLine Like…。这可能会增加一点时间。

答案 1 :(得分:0)

我假设“每个开放终端”表示cmd.exe进程。

temp[0]

这些PID有什么需要做的吗?

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

explicit vector (size_type n, const value_type& val = value_type(),
                 const allocator_type& alloc = allocator_type());