Esto combina aspectos de la respuesta de Gary y la respuesta de Oscar . Como señaló Gary, la salida de se query session
parece a
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console janedoe 1 Active
rdp-tcp 65536 Listen
o, en mi caso (usando "Cambiar usuario")
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console gman 1 Active
otherguy 2 Disc
(No tengo configurado RDP, por lo que no puedo probarlo). Presumiblemente, la intención de la pregunta es determinar la ID de la sesión actualmente activa. Sugiero buscar en la salida de query session
lo que parece la sesión actual:
for /f "tokens=2-4" %a in ('query session') do @if "%a"=="%username%" if "%c"=="Active" echo %b
que asigna la segunda, tercera y cuarta palabra (que esperamos ser el NOMBRE DE USUARIO, [SESIÓN] Identificación y estado) de cada línea de la salida de query session
a %a
, %b
y %c
, respectivamente, y luego informa de ID de sesión desde la línea donde USERNAME soy yo y STATE es Active
.
Resulta que query session
toma un username
parámetro, por lo que lo anterior se puede simplificar a
for /f "tokens=2-4" %a in ('query session %username%') do @if "%c"=="Active" echo %b
o
for /f "tokens=3-4" %a in ('query session %username%') do @if "%b"=="Active" echo %a
Para usar esto en un script (archivo por lotes), es posible que desee decir
set MY_SESSION_ID=unknown
for /f "tokens=3-4" %%a in ('query session %username%') do @if "%%b"=="Active" set MY_SESSION_ID=%%a
usando %%a
y %%b
(en lugar de %a
y %b
) porque está en un script. Probablemente pueda omitir @
si todo el archivo por lotes está debajo @echo off
. La inicialización le unknown
permite manejar errores (detectar si no hay línea en la salida de query session
esas coincidencias). Extender el manejo de errores para reconocer y reaccionar si hay varias líneas coincidentes en la salida de query session
se deja como ejercicio.