Windows 根据用户存在情况执行特定命令
在批处理文件中,我需要检查给定的用户是否存在,然后根据结果执行不同的命令 用户名在调用cmd的bat文件时作为参数 我想要的是这样的东西:Windows 根据用户存在情况执行特定命令,windows,batch-file,wmic,Windows,Batch File,Wmic,在批处理文件中,我需要检查给定的用户是否存在,然后根据结果执行不同的命令 用户名在调用cmd的bat文件时作为参数 我想要的是这样的东西: IF userExists ( do something ) else ( do something else ) 下面的代码可以检索匹配结果的数量,但我未能在IF语句中使用它 set username=%1 set searchUser="net user |find /c %username% " for /F "tokens=*" %
IF userExists (
do something
) else (
do something else
)
下面的代码可以检索匹配结果的数量,但我未能在IF语句中使用它
set username=%1
set searchUser="net user |find /c %username% "
for /F "tokens=*" %%i IN (%searchUser%) do set userCount=%%i
我希望在if语句中使用userCount
,但失败了
如何在if语句中使用我的
userCount
,或者有更好的方法吗?首先,%username%
是一个预定义的环境变量,请选择其他类似myuser
按照您最初的尝试使用计数
@echo off
set myname=%~1
for /F %%i IN ('net user ^| find /I /C "%myname% "') do (
if not "%%i"=="0" (
echo found %%i Matches of username
) else (
echo %%i matches found.
)
)
否则,使用%errorlevel%
@echo off
set "myuser=%~1"
net user |findstr /I /R /C:"\<%myuser%\>"
if not "%errorlevel%"=="0" (
echo %myuser% does NOT exist!
) else (
echo %myuser% exists!
)
首先,
%username%
是一个预定义的环境变量,请选择类似于myuser
按照您最初的尝试使用计数
@echo off
set myname=%~1
for /F %%i IN ('net user ^| find /I /C "%myname% "') do (
if not "%%i"=="0" (
echo found %%i Matches of username
) else (
echo %%i matches found.
)
)
否则,使用%errorlevel%
@echo off
set "myuser=%~1"
net user |findstr /I /R /C:"\<%myuser%\>"
if not "%errorlevel%"=="0" (
echo %myuser% does NOT exist!
) else (
echo %myuser% exists!
)
如果您只是想确定某个特定的用户帐户是否存在,而不是同一台电脑上存在多少个匹配的用户名,那么我建议您使用以下替代方法:
@Echo关闭
设置“ProfilePath=”
对于/F“Skip=1Delims=“%%A In('WMIC UserAccount Where^
“LocalAccount='TRUE'和Name=''%1''Get SID 2^>Nul')在(“%A”中为/F%%B执行操作”
)Do For/F“Tokens=2Delims==”%%C In('WMIC Path Win32_UserProfile其中^
“SID='%%B'和特殊!='True'”获取本地路径/值2^>Nul'
)Do For/F“Tokens=*”(%%C)中的%%D Do Set“ProfilePath=%%D”
如果已定义ProfilePath(回送用户配置文件%1存在于%ProfilePath%),则为%1,否则(
回显用户配置文件%1不存在)
暂停
包含If
命令和Pause
只是为了向您显示后续命令的If
|Else
结构(显然可以根据需要修改/更改)
如果不需要知道和/或访问用户配置文件路径,可以大大简化命令:
@Echo关闭
WMIC UserAccount,其中“LocalAccount='TRUE'和Name='%~1'”获取SID 2>Nul |查找“S-”>Nul&&(
回送用户配置文件%1存在)| |回送用户配置文件%1不存在
暂停
如果您只是想确定某个特定的用户帐户是否存在,而不是同一台电脑上存在多少个匹配的用户名,那么我建议您使用以下方法:
@Echo关闭
设置“ProfilePath=”
对于/F“Skip=1Delims=“%%A In('WMIC UserAccount Where^
“LocalAccount='TRUE'和Name=''%1''Get SID 2^>Nul')在(“%A”中为/F%%B执行操作”
)Do For/F“Tokens=2Delims==”%%C In('WMIC Path Win32_UserProfile其中^
“SID='%%B'和特殊!='True'”获取本地路径/值2^>Nul'
)Do For/F“Tokens=*”(%%C)中的%%D Do Set“ProfilePath=%%D”
如果已定义ProfilePath(回送用户配置文件%1存在于%ProfilePath%),则为%1,否则(
回显用户配置文件%1不存在)
暂停
包含If
命令和Pause
只是为了向您显示后续命令的If
|Else
结构(显然可以根据需要修改/更改)
如果不需要知道和/或访问用户配置文件路径,可以大大简化命令:
@Echo关闭
WMIC UserAccount,其中“LocalAccount='TRUE'和Name='%~1'”获取SID 2>Nul |查找“S-”>Nul&&(
回送用户配置文件%1存在)| |回送用户配置文件%1不存在
暂停
第一种方法对我不起作用。现有和不存在的usenames都返回用户存在message@GerhardBarnard您可以在第一个示例的末尾添加一个空格(/C:“^%myuser%”
),这样它将只匹配完整的用户名。@montonero,是的,谢谢。但我用词的边界来结束它。@montonero:在我的系统中,net user
以列的形式列出它们,三列一行,因此“行的开始”不是一个选项。@GerhardBarnard第一种方法很适合我,效果很好。谢谢(:Sipliy,我避免了errorlevel用法,所以我没有测试第二种方法,但感谢选项(:第一种方法对我不起作用。现有和不存在的usenames都返回user existsmessage@GerhardBarnard您可以在第一个示例的末尾添加一个空格(/C:“^%myuser%”
)所以它将只匹配完整的用户名。@montonero,是的,谢谢。但是我用单词边界来修饰它。@montonero:在我的系统中,net user
以列的形式列出它们-三行-因此“行的开始”不是一个选项。@GerhardBarnard第一种方法很适合我,效果很好。谢谢(:Sipliy,我避免使用errorlevel,因此我没有测试第二种方法,但感谢您的选择(:您的任务对我来说毫无意义。您的本地系统上不应该有多个同名用户,因此您试图确定什么?尽管如此,即使有两个同名用户,net user
命令的输出可能如下所示,Administrator FallenAngelFallenAngel
,因为Find/C
只计算匹配的行数,这将返回1
,尽管显然存在2
。您的任务是否只是试图确定本地系统上是否有一个简单的同名用户?如果是,请查看我的答案,这应该会起作用。@Compo我的主要目标是删除判断用户是否存在。您的任务对我来说毫无意义。您的本地系统上不应该有多个同名用户,那么您想确定什么?尽管如此,即使有两个同名用户,net user
命令的输出可能如下所示,AdministratorFallenAngel FallenAngel
由于Find/C
只计算匹配行,因此尽管存在2
,但这将返回1
。您的任务是否只是试图确定是否存在一个用户