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