2011-10-18 62 views

回答

10

这里是我做到了,在批处理文件使用net命令find命令一个取巧的办法:

set command=net user "%USERNAME%" /domain | FIND /I "Full Name" 

FOR /F "tokens=1 delims=" %%A in ('%command%') do SET fullNameText=%%A 
set fullName=%fullNameText:Full Name=% 
for /f "tokens=* delims= " %%a in ("%fullName%") do set fullName=%%a 

第一行存储,我们希望在一个变量来执行命令。它从环境变量中提取用户名,并将其传递给net user命令以及/domain参数,以告知它从当前域中取消。然后它将结果从当前用户的一堆数据中导出到find方法,该方法将只提取我们想要的属性。查找结果的格式为“全名John Doe”。第二行将执行命令并将结果放入变量fullNameText。第三行将删除结果的“全名”部分,并以“John Doe”结尾。带for循环的第四行将删除结果中的所有前导空格,最后在fullName变量中出现“John Doe”。

+0

我们可以通过运行以下命令行commnad找到计算机的域名。 systeminfo | findstr/B/C:“域” 我们可以使用环境变量'Userdomain'找到登录用户的域。下面给出了这个命令。 echo%userdomain% – Sathish

+1

太棒了!在PowerShell中也是如此:((net user $ env:USERNAME/domain | Select-String“Full Name”)--replace“Full Name”,“”)。Trim() –

+0

我需要围绕%command%逗号在第二行,使其工作:(“‘%命令%’”) – elady

0

我构建了一个批处理文件,通过使用set p和goto选择一个动作来快速完成一些操作。我要抛弃不必要的部分。

@echo off 

:begin 

echo 5. Find who is on remote PC right now 

echo. 

set /p a= 

IF %a%==5 (goto whoson) 

REM Whos on 
:whoson 
set /p remotecomputername=Enter computer name to see the current user: 
wmic /node:%remotecomputername% computersystem get username 
pause 
goto begin 

我希望它有帮助。

+0

刚导致无限循环的错误提示:无效的全局开关。 –

4

这里的skeletank's响应这是稍微干净是为我工作...的衍生物(我试过skeletank's响应,并没有工作对我来说它是书面的,因此,下面我的回答方式。)

SET TNAME="net user %USERNAME% /domain| FIND /I "Full Name"" 
FOR /F "tokens=3,4 delims=, " %%A IN ('%TNAME%') DO SET DNAME=%%B %%A 

然后,您可以在任何需要的地方使用“DNAME”,以便输出回声或使用“IF”语句进行验证。您可以翻转'%% B'和'%% A'标记以回到姓氏第一个布局。这节省了skeletank's原始响应中使用的额外努力。

变量:
- TNAME =临时名称
- DNAME =显示名称

-Thanks skeletank

+0

工作就像一个魅力 – fmuecke

1

这应该是一个干净的方式使用dsquery和dsget而不依赖于“全名”,这是语言相关的输出,而“FN”似乎与不同语言版本的Windows一起工作。

for /F "tokens=2" %i in ('dsquery user -samid %username% ^| dsget user -L -fn ^| find "fn:"') DO @echo %i 

dsget -L开关给出了列出的输出“fn:USER”,所以剩下的唯一东西就是抓住输出中的第二列。 找到“fn:”用于摆脱“dsget succeeded”输出。

+0

win10在cmd执行结果: 用户名“')DO @echo我在这个时候是意外 看起来像它是从机器上不存在的dsquery –

+0

这是格式化的命令行使用。 ,请参阅我的回答,了解命令行和脚本格式之间的区别,该命令需要在运行它的计算机上安装RSAT – Lectrode

0

如果你想为人类使用 - 这意味着你不需要自动解析它,所以你得到只是的全名 - 你可以在命令提示符下键入net user <username> /domain,并宣读了“全名”字段。

参考:Getting detailed domain user info from the command line

+1

链接断开,并且当您登录到其他域帐户时此命令不起作用从你的机器连接到,在AD森林 –

+0

@MattKerr,我固定的联系,在一个蝙蝠结果由于 –

1

接受的答案(在发布的时间)有4行代码,当你只需要一个做同样的事情:

for /f "tokens=2*" %n in ('net user "%USERNAME%" /domain^|FINDSTR /C:"Full Name"') do echo "%o" 

这甚至会工作,如果全名已经超过200件。适用于Windows工作站“开箱即用”,不需要管理员权限。

注意:当在批处理文件中使用时,请记住分别将%n%o更改为%%n%%o

解释命令:

"tokens=2*指定唯一的令牌,将关注是后(分配到下一个字母:%o)的第二令牌(分配给%n),和一切

默认delims是空格,所以我们不需要定义它,但是如果我们需要手动定义它,它将如下所示:"tokens=2* delims= "。由于空格是分隔符,因此它将忽略所有前导空格。

管道(|)被胡萝卜(^)转义,告诉命令处理器最初忽略它。

我也更喜欢用FINDSTR而不是FIND,因为(在我的测试中)我发现它是更快的命令,如果您经常使用它,它可能会有所作为。如果您愿意,可以使用FIND "Full Name"轻松替换FINDSTR /C:"Full Name"

+0

win10 CMD执行: USERNAME“全名”“)是意外的在这个时候。 –

+0

如果用户位于与当前连接到的域不同的域上(但仍位于AD forest w/trust中), 该请求将在域XXX.XXX.XXX的域控制器中处理。 无法找到用户名。 通过键入NET HELPMSG 2221可以获得更多的帮助。 –

+0

OP问题询问命令“来自命令提示符”。我的回答是这样格式化的。但是,我特别说明如何为.bat脚本格式化它,如果您想为此使用它。请参阅“注意”。 – Lectrode

1

Lectrode answer in one string will be like this:

for /f "usebackq tokens=2,* delims= " %%a in (`net user "%USERNAME%" /domain ^| find /i "Full Name"`) do set FULLNAME=%%b 
+0

请注意这是为bat或cmd脚本格式化的。这不会起作用,因为OP上面提到的 – Lectrode

+0

'''对于/ f“usebackq tokens = 2,* delims =”%a in('net user“%USERNAME%”/ domain^| find/i“ Full Name“')do set FULLNAME =%b''' ///只需将double%%更改为%,它将从CMD起作用//// – kgimpel

相关问题