数字比较CMD问题



这里的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)。

最新更新