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 sessionis deixado como um exercício.