Esto combina aspectos de la respuesta de Gary y de la respuesta de Oscar . Como señaló Gary, la salida de query session
parece algo así como
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console janedoe 1 Active
rdp-tcp 65536 Listen
o, en mi caso (usando “Switch user”)
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console gman 1 Active
otherguy 2 Disc
(no tengo RDP configurado, así que no puedo hacer pruebas con él. ) Presumiblemente la intención de la pregunta es determinar el ID de la sesión actualmente activa. Sugiero buscar en la salida de query session
lo que parece ser 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 2ª, 3ª y 4ª palabra (que esperamos que sean el USERNAME, el ID de [SESSION] y el STATE) de cada línea de la salida de query session
a %a
, %b
y%c
, respectivamente, y luego informa del ID de la sesión de la línea donde USERNAME es yo y STATE es Active
.
Resulta que query session
toma un parámetro username
, así que lo anterior puede simplificarse 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), podría 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 puede omitir el @
si todo el archivo por lotes está bajo @echo off
. La inicialización a unknown
le permite hacer el manejo de errores (detectar si no hay ninguna línea en la salida de query session
que coincida). Extender el manejo de errores para reconocer y reaccionar si hay múltiples líneas que coinciden en la salida de query session
se deja como un ejercicio.