Łączy to aspekty odpowiedzi Gary'ego i odpowiedzi Oscara . Jak zauważył Gary, wyjście query session
wygląda jak
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console janedoe 1 Active
rdp-tcp 65536 Listen
lub, w moim przypadku (używając “Switch user”)
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console gman 1 Active
otherguy 2 Disc
(nie mam skonfigurowanego RDP, więc nie mogę z nim testować. ) Przypuszczalnie intencją pytania jest określenie identyfikatora aktualnie aktywnej sesji. Proponuję przeszukanie wyjścia query session
w poszukiwaniu czegoś, co wygląda na bieżącą sesję:
for /f "tokens=2-4" %a in ('query session') do @if "%a"=="%username%" if "%c"=="Active" echo %b
co przypisuje 2, 3 i 4 słowo (które, jak mamy nadzieję, jest USERNAME, [SESSION] ID i STATE) z każdego wiersza wyjścia query session
do %a
, %b
i%c
, odpowiednio, a następnie zgłasza SESSION ID z wiersza, w którym USERNAME to ja, a STATE to Active
.
Okazuje się, że query session
przyjmuje parametr username
, więc powyższe można uprościć do
for /f "tokens=2-4" %a in ('query session %username%') do @if "%c"=="Active" echo %b
lub
for /f "tokens=3-4" %a in ('query session %username%') do @if "%b"=="Active" echo %a
Aby użyć tego w skrypcie (pliku wsadowym), możesz chcieć powiedzieć
set MY_SESSION_ID=unknown
for /f "tokens=3-4" %%a in ('query session %username%') do @if "%%b"=="Active" set MY_SESSION_ID=%%a
używając %%a
i %%b
(zamiast %a
i %b
), ponieważ jest to w skrypcie. Prawdopodobnie możesz pominąć @
, jeśli cały plik wsadowy jest poniżej @echo off
. Inicjalizacja do unknown
pozwala na obsługę błędów (wykrywanie, czy nie ma linii na wyjściu query session
, która by pasowała). Rozszerzenie obsługi błędów do rozpoznawania i reagowania, jeśli jest wiele pasujących linii na wyjściu query session
jest pozostawione jako ćwiczenie.