2015-08-25 95 views
1

這裏的if語句不起作用。爲什麼?我的意思是SID以502結尾,它進入第一個條件,如502是大於1000. -UPDATE:所以這似乎是一個長度問題。數字的數量必須在比較的兩邊相等。如何我強迫他們等長嗎?數字比較CMD問題

@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 
       ) 
      ) 
     ) 
    ) 

回答

1

因爲字符串比較的啓示。你需要設置變量與數字與SET/A

 
for /f "tokens=8 delims=-" %%b in ('echo S-1-5-21-2685429265-1343094091-1357998488-3175') do (set /A NUM=%%b) 
if %NUM% LSS 1000 (echo less) 
+0

它的工作,但與「if!num!lss 100(命令)」 –

1

的問題是,從wmic命令retrived的信息包括結束空間(至少它在我的機器爲sid字段),並在每一行的末尾的最終回車(已知「問題」wmic輸出),將檢索到for替換的參數。

在這種情況下,最簡單的解決方案是改變查詢到wmiccsv格式來檢索數據,並且包括將要沒有處理的附加不需要的字段,這將防止我們的代碼從輸出檢索結束滑架在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查詢已被更改爲檢索這兩個字段。爲此,逗號需要被轉義(^)以包含在for /f命令中。

csv輸出是在線作爲分隔符和該令牌數使用逗號處理已經改變。該csv格式將包括機器名(node場)作爲第一場,因此,我們需要處理的令牌2(name)和3(sid)。

csv格式字段(除第一個,總是node)按字母順序排序。爲了避免sid場最後一節車廂回報的包容,在Status場(status GTR sid)也已要求。