这里的if语句不工作,为什么?我的意思是SID以502结束它进入第一个条件,比如502大于1000。-UPDATE:所以这似乎是一个长度问题。两边的位数必须相等。如何使它们的长度相等?
@ECHO OFF
ECHO PROGRAMA DE USUARIOS
for /f "skip=1" %%a in ('wmic useraccount get name') do (
if %%a GTR 0 (
for /f "tokens=8 delims=-" %%b in ('wmic useraccount where name^="%%a" get sid') do (
echo User Accounts:
if %%b GEQ 1000 (
echo NAME
echo %%a
wmic useraccount where name^="%%a" get sid
echo %%b
)
)
)
)
for /f "skip=1" %%a in ('wmic useraccount get name') do (
if %%a GTR 0 (
for /f "tokens=8 delims=-" %%b in ('wmic useraccount where name^="%%a" get sid') do (
echo System Accounts:
if %%b LSS 1000 (
echo NAME
echo %%a
wmic useraccount where name^="%%a" get sid
echo %%b
)
)
)
)
这是因为字符串比较。您需要使用set/A
将变量设置为数字<>之前for/f "tokens=8 delims=-" %%b in ('echo S-1-5-21-2685429265-1343094091-1357998488-3175') do (set/A NUM=%%b)如果%NUM% LSS 1000(回声少)问题是,从wmic
命令检索的信息包括结束空格(至少它在我的机器中用于sid
字段)和每行末尾的最后回车(wmic
输出中已知的"问题"),将被检索到for
可替换参数。
在这种情况下,最简单的解决方案是将查询更改为wmic
以检索csv
格式的数据,并包含一个额外的不需要的字段,该字段将不会被处理,这将阻止我们的代码检索wmic
命令
@echo off
setlocal enableextensions disabledelayedexpansion
echo PROGRAMA DE USUARIOS
echo(
echo Cuentas de usuario:
call :showAccounts
echo(
echo Cuentas de sistema:
call :showAccounts system
echo(
goto :eof
:showAccounts [system]
setlocal enableextensions disabledelayedexpansion
if /i "%~1"=="system" (
set "condition=LSS 1000"
) else (
set "condition=GEQ 1000"
)
for /f "skip=1 tokens=2,3 delims=," %%a in ('
wmic useraccount get name^,sid^,status /format:csv
') do for /f "tokens=8 delims=-" %%c in ("%%b") do (
if %%c %condition% (
echo( Name: %%a
echo( SID : %%b
)
)
goto :eof
为了避免代码的重复,信息检索被移到一个子例程中,并被调用两次以检索用户和系统帐户(不需要,只是一种习惯,我不喜欢重复代码)。
用户或系统帐户将根据字符串system
作为子例程调用的第一个参数的存在而显示。定义变量以包含要匹配的条件。
不再执行一个查询来检索帐户列表,并为每个帐户执行一个查询来检索sid
,而是将wmic
查询更改为检索两个字段。为此,需要对逗号进行转义(^
s),以便包含在for /f
命令中。
使用行中的逗号作为分隔符处理csv
输出,并且令牌编号已更改。csv
格式将包括机器名称(node
字段)作为第一个字段,因此我们需要处理令牌2 (name
)和3 (sid
)。
在csv
格式中,字段(除了第一个,总是node
)按字母顺序排序。为了避免在sid
字段中包含最后一个回车,还请求Status
字段(status
gtr sid
)。