Este combina aspectos da resposta de Gary e a resposta de Oscar . Como observado por Gary, a saída query sessionparece 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
(Eu não tenho o RDP configurado, então não posso testar com ele.) Presumivelmente, a intenção da questão é determinar o ID da sessão atualmente ativa. Eu sugiro pesquisar a saída de query session
para o que parece ser a sessão atual:
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 estaduais) de cada linha da saída de query sessiona %a, %be %c, respectivamente, e, em seguida, relatórios de sessão ID da linha onde USERNAME sou eu e STATE é Active.
Acontece que query sessionleva um usernameparâmetro, então o acima 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
Para usar isso em um script (arquivo em lotes), você pode querer dizer
set MY_SESSION_ID=unknown
for /f "tokens=3-4" %%a in ('query session %username%') do @if "%%b"=="Active" set MY_SESSION_ID=%%a
usando %%ae %%b(em vez de %ae %b) porque está em um script. Você provavelmente pode deixar de fora @
se o arquivo de lote inteiro estiver sob @echo off. A inicialização unknownpermite que você faça o tratamento de erros (detectando se não há nenhuma linha na saída query session
correspondente). Estender o tratamento de erros para reconhecer e reagir se houver várias linhas correspondentes na saída query session
é deixado como um exercício.