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