我需要获得每个开放终端的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?
答案 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());