Это объединяет аспекты ответа Гэри и ответа Оскара.
Как отметил Гэри, вывод 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
оставлено в качестве упражнения.