Це поєднує в собі аспекти відповіді Гарі і відповіді Оскара . Як зауважив Гері, вихід 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
залишається як вправа.