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