在Windows 7中运行的批处理脚本中,我有几个IF子句,例如:
IF "%USERNAME%"=="foo" GOTO bar
不幸的是,当我从上下文菜单中运行以“ 以管理员身份运行”提升的批处理脚本时,%USERNAME%
始终是管理员的用户名,而不是当前活动登录用户的用户名。
对于提升的批处理脚本中的whoami
同样适用。
[QUERY USER
为我提供了当前登录的所有用户的列表,而不仅仅是我要寻找的一个用户。
标准用户帐户,与可以在保持相同用户环境的情况下从用户组令牌升至管理员组令牌的管理员帐户不同,当选择了“ 以管理员身份运行”时,实际上会加载管理员帐户环境。
是否有办法获取当前的活动登录用户名而不是管理员用户名?
@echo off
setlocal
rem Get logon username without the leading "computername\" string.
set "user="
for /f "skip=1 tokens=1,* delims=\" %%A in (
'wmic computersystem get username ^|findstr /r /v "^$"'
) do for %%C in (%%~B) do if not defined user set "user=%%~C"
echo "%user%"
pause
使用for /f
选项skip=1
,因为第一行是不需要的UserName
标头。用\
分隔,因为该值类似于computername\username
并获得第二个令牌中的余数。用管道传输到findstr
以忽略空行。第二个for
循环将获得第一个不含空格字符的值。
使用command /?
获得更多帮助。代码中的大多数命令将在命令提示符下显示/?
参数的帮助。
@echo off
setlocal
rem Get logon username without the leading "computername\" string.
set "user="
for /f %%A in ('quser^|findstr /b /c:">"') do set "user=%%~A"
if defined user if "%user:~0,1%" == ">" set "user=%user:~1%"
echo "%user%"
pause
>
中的前quser
(别名 query user
)表示当前登录的用户名,而不是管理员的用户名。
在需要时使用%user%
代替%username%
。
注意:由于for /f
循环从token=1
的默认选项中获取用户名,如果用户名包含空格或制表符,则它将仅获取该空格或制表符之前的字符。
参考: