Łą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 sessionjest pozostawione jako ćwiczenie.