在运行命令行脚本时,是否可以获得当前用户的名称?
您可以使用用户名变量: %USERNAME%
%USERNAME%
它应该是在 %USERNAME%。显然,这可以很容易欺骗,所以不要依赖于它的安全。
有用的提示: 在命令提示符中键入 set将列出所有环境变量。
set
用户名:
echo %USERNAME%
域名:
echo %USERDOMAIN%
通过在命令提示符下运行命令 set,您可以获得环境变量的完整列表。
Windows 没有一些更有用的 Unix 小脚本实用程序,比如 谁/哇塞、 Sed和 AWK,这总是让我很恼火。无论如何,如果你想要一些简单易行的东西,使用 Visual Studio Express 并编译以下代码:
#include <windows.h> #include <stdio.h> int main(int argc, char **argv) { printf("%s", GetUserName()); }
在你的批处理文件中使用它。
% USERNAME% 将为您提供当前正在运行的进程的用户名。根据您运行批处理文件的方式,这不一定与当前用户的名称相同。例如,您可能正在通过计划任务、服务等运行批处理文件。
下面是一种更可靠的获取当前登录用户的用户名的方法,它可以通过刮取启动 Explorer.exe 任务的用户的名称:
for /f "TOKENS=1,2,*" %%a in ('tasklist /FI "IMAGENAME eq explorer.exe" /FO LIST /V') do if /i "%%a %%b"=="User Name:" set _currdomain_user=%%c for /f "TOKENS=1,2 DELIMS=\" %%a in ("%_currdomain_user%") do set _currdomain=%%a & set _curruser=%%b
我在编写用于测试的批处理文件时使用这种方法。
echo %userdomain%\%username%
因为如果需要身份验证,您必须将密码包含在纯文本中,所以我只会在完全私有的环境中使用它,其他用户无法查看它,或者如果用户看到密码将不会承担任何后果。
希望这能帮到别人。
在标准上下文中,每个连接的用户都拥有一个 glober.exe 进程: 命令[ tasklist/V | find“ Explorer”]返回一行,其中包含 glober.exe 进程所有者的进程,通过一个经过调整的正则表达式,可以获得所需的值。这也可以在 Windows7下完美运行。
在极少数情况下,Explorer.exe 被另一个程序替换,可以调整 find 筛选器来匹配这种情况。如果命令返回一个空行,那么很可能没有用户登录。在 Windows 7中也可以运行[ query session | find“ >”]。
只需在命令提示符中使用此命令
C:\> whoami
在批处理和其他 Windows 环境中,%USERNAME% 是正确答案。
另一种选择是使用 %USERPROFILE%获取用户的路径,如 C:\Users\username。
%USERPROFILE%
C:\Users\username
至于找到最好的 BlueBearr 响应(而我,正在运行我的批处理脚本,例如。系统权限)我必须添加一些东西到它。 因为在我的 Windows 语言版本(波兰语)中,要被“%% a%% b”= = “ User Name:”捕捉到的行将变得非常复杂(它在我的语言中包含一些发音符号) ,我跳过前7行,在第8行进行操作。
@for /f "SKIP= 7 TOKENS=3,4 DELIMS=\ " %%G in ('tasklist /FI "IMAGENAME eq explorer.exe" /FO LIST /V') do @IF %%G==%COMPUTERNAME% set _currdomain_user=%%H
在大多数情况下,% USERNAME% 变量将是您想要的。
但是,如果您正在运行升级的 cmd shell,那么% USERNAME% 将报告管理员名称,而不是您自己的用户名。如果你想知道后者,那就跑吧:
for /f "tokens=2" %u in ('query session ^| findstr /R "^>"') do @echo %u
答案取决于您使用的是哪种“命令行脚本”语言。
在旧的 cmd.exe命令提示符或 .bat或 .cmd脚本中,可以使用以下命令:
cmd.exe
.bat
.cmd
%USERNAME%-获取用户名。
%USERDOMAIN%-获取用户的域。
%USERDOMAIN%
在 PowerShell 命令提示符或 .ps1或 .psm1脚本中,可以使用以下命令:
.ps1
.psm1
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name-提供完全限定的用户名(如域用户名)。这也是最安全的方法,因为它不能像下面的其他 $Env变量一样被用户重写。
[System.Security.Principal.WindowsIdentity]::GetCurrent().Name
$Env
$Env:Username-获取用户名。
$Env:Username
$Env:UserDomain-获取用户的域。
$Env:UserDomain
$Env:ComputerName-获取计算机的名称。
$Env:ComputerName
whoami-以“域用户名”的格式获取用户的域和用户名。
whoami
这也适用于 Unix 系统,而不仅仅是 Windows,所以这是一个很好的跨平台解决方案。
这是 username 变量和 whoami 命令之间的主要区别:
C:\Users\user.name>echo %username% user.name C:\Users\user.name>whoami domain\user.name DOMAIN = bios name of the domain (not fqdn)
通过 powershell (file.ps1) 我使用以下方法
$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
它以“ DomainUsername”格式返回用户的名称。 如果你只是想要用户名,只要写
$username = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name.Split("\")[1]
它的优点是可以在 Windows10 Windows8服务器2016上运行。据我所知,还有其他的操作系统,比如 Win7等等(没有更老的) 。是的,通过批,你可以简单地使用
$username = &whoami
只要在命令提示符中键入 whoami,就会得到当前的用户名。