Isto combina aspectos de Gary’s answer e Oscar’s answer . Como notado por Gary, a saída de query session
parece algo como
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console janedoe 1 Active
rdp-tcp 65536 Listen
ou, no meu caso (usando “Switch user”)
SESSIONNAME USERNAME ID STATE TYPE DEVICE
services 0 Disc
>console gman 1 Active
otherguy 2 Disc
(não tenho o RDP configurado, por isso não posso testar com ele. ) presumivelmente a intenção da pergunta é determinar a identificação da sessão actualmente activa. sugiro procurar a saída de query session
para o que se parece com a sessão actual:
for /f "tokens=2-4" %a in ('query session') do @if "%a"=="%username%" if "%c"=="Active" echo %b
que atribui a 2ª, 3ª, e 4ª palavra (que esperamos ser o USERNAME, [SESSION] ID, e STATE) de cada linha da saída de query session
a %a
, %b
, e %c
, respectivamente, e depois reporta SESSION ID da linha onde USERNAME sou eu e STATE é Active
.
Acontece que query session
toma um parâmetro username
, pelo que o anterior pode ser simplificado para
for /f "tokens=2-4" %a in ('query session %username%') do @if "%c"=="Active" echo %b
ou
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
Para utilizar isto num script (ficheiro batch), talvez seja melhor dizer
0x1&
utilizando %%a
e %%b
(em vez de %a
e %b
) porque está num script. Provavelmente pode deixar de fora o @
& se todo o ficheiro do lote estiver abaixo de @echo off
. A inicialização para unknown
& permite-lhe fazer a manipulação de erros (detectando se não há nenhuma linha na saída de query session
que corresponda). Estendendo a manipulação de erros para reconhecer e reagir se há múltiplas linhas correspondentes na saída de query session
is deixado como um exercício.