Это сочетает в себе аспекты ответа Гэри и ответа Оскара . Как отметил Гэри, выход query session выглядит как
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console janedoe 1 Active
rdp-tcp 65536 Listen
или, в моем случае (с помощью “Switch user”)
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-е слова (которыми мы надеемся быть USERNAME, [SESSION] ID и STATE) из каждой строки выхода 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 sessionis  имеется multipleсоответствующих строк; слева в качестве упражнения.