Search code examples
windowsvariablesbatch-filecmdfindstr

Equal variables - Batch


So, I've the following batch script:

@echo off
 set /p name= 
 rem a random number, don't care about it.
 set complete_name=%name%.Creepy
 Goto STEP1
:STEP1
 echo %complete_name%|findstr /C:"9000" >nul 2>&1
 if not errorlevel 1 (
 goto 9000
 ) else ( 
 GOTO CHECK2
 )
 :CHECK2
 echo %complete_name%|findstr /C:"930" >nul 2>&1
 if not errorlevel 1 (
 goto 930
 ) else ( 
 GOTO CHECK3
 )
 :CHECK3
 echo %complete_name%|findstr /C:"310" >nul 2>&1
 if not errorlevel 1 (
 goto 310
 ) else ( 
 ECHO PROBLEM
 ) 
 :9000 
 ECHO 9000
 PAUSE
 :930
 ECHO 930
 PAUSE
 :310
 ECHO 310
 PAUSE

I want it to check if "9000" is in the variable or not, same for "930" and "310". And if none of these numbers are in the variable Echo problem. But everytime i run this script it goes to ECHO PROBLEM even if 9000/920/310 is in %complete_name%. So, is this the right way to check if a variable is in another one or there is an easier way to do it?

So I've tried this code:

@echo off
set name=310
set complete_name=%name%.Creepy
Goto STEP1
:STEP1
 setlocal
    if "%complete_name:9000=%"=="%complete_name%" (
      if "%complete_name:930=%"=="%complete_name%" (
        if "%complete_name:310=%"=="%complete_name%" (
        echo PROBLEM
        ) else ( 
        goto 9000
        ) 
      ) else ( 
      goto 930
      ) 
    ) else ( 
    goto 310
    )
    goto :eof

but I'm stuck at echo problem...


Solution

  • Save next code snippet, possibly named blabla.bat:

    @Echo OFF
    setlocal
    set complete_name=%1
    if "%complete_name:9000=%"=="%complete_name%" ( 
      if "%complete_name:930=%"=="%complete_name%" ( 
        if "%complete_name:310=%"=="%complete_name%" ( 
          echo problem 
        ) else ( 
          echo valid 310
        ) 
      ) else ( 
        echo valid 930
      ) 
    ) else ( 
      echo valid 9000
    )
    Exit /B
    

    and watch the output from

    blabla x9000y
    blabla x930y
    blabla x310y
    blabla x9a0b0c0y
    

    That's a way of 1. nested IF ... ( ... ) ELSE ( ... ) and 2. using "Edit/Replace" a variable

    Or, if GOTOs considered necessary, there is something similar with For loop (a good thought topic as well..).

    @Echo OFF
    setlocal EnableDelayedExpansion
    set complete_name=%1
    for %%G in (9000 930 310) DO (
      if /I "!complete_name:%%G=!" neq "%complete_name%" GOTO :%%G
    )
    echo problem %complete_name%
    GOTO :commonEnd
    :9000
      Echo valid 9000 %complete_name%
      GOTO :commonEnd
    :930
      Echo valid 930 %complete_name%
      GOTO :commonEnd
    :310
      Echo valid 310 %complete_name%
      GOTO :commonEnd
    :commonEnd