Это объединяет аспекты ответа Гэри и ответа Оскара.
Как отметил Гэри, вывод query session выглядит примерно так:
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console janedoe 1 Active
rdp-tcp 65536 Listen
или, в моем случае (с помощью «Переключить пользователя»)
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console gman 1 Active
otherguy 2 Disc
(У меня не настроен RDP, поэтому я не могу проверить его.)
Предположительно, целью вопроса является определение идентификатора текущего активного сеанса.
Я предлагаю поискать в выходных данных query session то, что выглядит как текущий сеанс:
for /f "tokens=2-4" %a in ('query session') do @if "%a"=="%username%" if "%c"=="Active" echo %b
который присваивает 2-е, 3-е и 4-е слова (которые, как мы надеемся, будут ИМЯ ПОЛЬЗОВАТЕЛЯ, ИД [SESSION] и СОСТОЯНИЕ) из каждой строки вывода query session , соответственно, для %a , %b и %c , и затем сообщает SESSION ID из строки, где USERNAME - это я, а STATE - Active .
Оказывается, что query session принимает параметр username , поэтому вышесказанное можно упростить до
for /f "tokens=2-4" %a in ('query session %username%') do @if "%c"=="Active" echo %b
или же
for /f "tokens=3-4" %a in ('query session %username%') do @if "%b"=="Active" echo %a
Чтобы использовать это в сценарии (командный файл), вы можете сказать,
set MY_SESSION_ID=unknown
for /f "tokens=3-4" %%a in ('query session %username%') do @if "%%b"=="Active" set MY_SESSION_ID=%%a
используя %%a и %%b (вместо %a и %b), потому что это в скрипте.
Вероятно, вы можете пропустить @ если весь пакетный файл находится под @echo off .
Инициализация в unknown позволяет вам выполнять обработку ошибок (обнаружение, если в выводе query session нет соответствующей строки).
Расширение обработки ошибок для распознавания и реагирования при наличии нескольких совпадающих строк в выводе query session оставлено в качестве упражнения.