2

The following batch file works perfectly for the first 10 options. However I do not know how to extend the functionality of the batch file more than 10 option 0- 9. I have 35 possible options.

    @ECHO OFF
    MODE CON:COLS=100 LINES=50
    SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION

    (SET sourceFolder=C:\Users\Administrator\Desktop\test)
    ](SET targetFolder=C:\Users\Administrator\Desktop\test2)

    SET /P "customerID=Enter Customer ID: "

    :MENU
    CLS
    ECHO=
    ECHO= ..................................................
    ECHO= PLEASE SELECT THE OPTION FROM THE EVENT MENU BELOW
    ECHO= ..................................................

    ECHO    Option Number       Event Number        Event Name
    ECHO.                   
    ECHO.   0.      101     NewCustomer
    ECHO.   1.      102     ExisingCustomer
    ECHO.   2.      103     LockedAccount
    ECHO.   3.      104     DeleteAccount
    ECHO.   4.      105     ExpireSession
    ECHO.   5.      106     PasswordUpdated
    ECHO.   6.      107     PasswordReset
    ECHO.   7       108     HackedAccount
    ECHO.   8.      109     UpdateProfile
    ECHO.   9.      110     UpdateLists
    ECHO.   A.      111     NewPurchase
    ECHO.   B.      112     ExisingSale
    ECHO.   C.      113     AmendOrder
    ECHO.   D.      114     AmendDelivery
    ECHO.   E.      115     CancelOrder
    ECHO.   F.      116     OvernightFiles
    ECHO.   G.      117     DailyFiles
    ECHO.   H.      118     HelpFlies
    ECHO.   I.      119     FraudAccount
    ECHO.   J.      120     DeadCustomer
    ECHO.   K.      121     WelcomeEmail
    ECHO.   L.      122     OrderEmail
    ECHO.   M.      123     OrderAmmended
    ECHO.   N.      124     NoRemainingStock
    ECHO.   O.      125     ReplenishStock
    ECHO.   P.      126     SalesQuery
    ECHO.   Q.      127     UpdateFirstName
    ECHO.   R.      128     UpdateSurname
    ECHO.   S.      129     UpdateAddress
    ECHO.   T.      130     UpdateDateOfBirth
    ECHO.   U.      131     UpdateContactNo
    ECHO.   V.      132     UpdateEmail
    ECHO.   W.      133     UpdatePreferences
    ECHO.   X.      134     UpdateEmailPreferences
    ECHO.   Y.      135     UpdateBankDetails



    CHOICE /C 0123456789ABCDEFGHIJKLMNOPQRSTUVWXY /M "CHOOSE AN OPTION"
    SET "Option=%ERRORLEVEL%"
    FOR /F "TOKENS=1-4 DELIMS=. " %%A IN ('FINDSTR/BC:"ECHO.  " "%~f0"'
        ) DO IF "%%B"=="%Option%" (SET "Name=%%C" & SET "Code=%%D")

    FOR /F "DELIMS=" %%A IN (
        'FINDSTR/MISC:"%customerID%" "%sourceFolder%\*"^|FINDSTR/MIF:/ /C:"%Name%"'
        ) DO COPY "%%A" "%targetFolder%"

    PAUSE
anallyexcel
  • 65
  • 1
  • 7
  • you seem to master the batch subject. What is your exact question then? what's wrong? btw: `](SET` is that a typo? – Jean-François Fabre Oct 13 '16 at 21:37
  • @Jean The choice system created for the OP was designed only for a handful of options. That handful has now expanded to 35 so the verification system for selected options requires a rethink. – Compo Oct 13 '16 at 21:42
  • what about nested menus? 0-9 which triggers sub menu with 0-9 if required, and so on? – Jean-François Fabre Oct 13 '16 at 21:45
  • Already suggested in previous topic, but not preferred option. 'Wants a single page menu with all options visible' . – Compo Oct 13 '16 at 21:50

3 Answers3

1

Took me some time to understand what your problem was:

when you type a choice, you get the index of the choice and not the relevant letter, making it impossible to link back to the selected item of the menu if not 0-9.

So I propose to convert back your index to the entered letter like this (extract):

SET "Option=%ERRORLEVEL%"  <== this is your code

rem here scan for correct letter
FOR /L %%a IN (0,1,35) DO if %%a==%Option% set idx=%%a
rem small correction of index
set /A idx-=1
set Option=!Choice:~%idx%,1!

Full test code, pressing a digit or a letter prints the letter and the code & title of the menu:

@echo off

set CHOICE=0123456789ABCDEFGHIJKLMNOPQRSTUVWXY

SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

:MENU
CLS
ECHO=
ECHO= ..................................................
ECHO= PLEASE SELECT THE OPTION FROM THE EVENT MENU BELOW
ECHO= ..................................................

ECHO    Option Number       Event Number        Event Name
ECHO.                   
ECHO.   0.      101     NewCustomer
ECHO.   1.      102     ExisingCustomer
ECHO.   2.      103     LockedAccount
ECHO.   3.      104     DeleteAccount
ECHO.   4.      105     ExpireSession
ECHO.   5.      106     PasswordUpdated
ECHO.   6.      107     PasswordReset
ECHO.   7       108     HackedAccount
ECHO.   8.      109     UpdateProfile
ECHO.   9.      110     UpdateLists
ECHO.   A.      111     NewPurchase
ECHO.   B.      112     ExisingSale
ECHO.   C.      113     AmendOrder
ECHO.   D.      114     AmendDelivery
ECHO.   E.      115     CancelOrder
ECHO.   F.      116     OvernightFiles
ECHO.   G.      117     DailyFiles
ECHO.   H.      118     HelpFlies
ECHO.   I.      119     FraudAccount
ECHO.   J.      120     DeadCustomer
ECHO.   K.      121     WelcomeEmail
ECHO.   L.      122     OrderEmail
ECHO.   M.      123     OrderAmmended
ECHO.   N.      124     NoRemainingStock
ECHO.   O.      125     ReplenishStock
ECHO.   P.      126     SalesQuery
ECHO.   Q.      127     UpdateFirstName
ECHO.   R.      128     UpdateSurname
ECHO.   S.      129     UpdateAddress
ECHO.   T.      130     UpdateDateOfBirth
ECHO.   U.      131     UpdateContactNo
ECHO.   V.      132     UpdateEmail
ECHO.   W.      133     UpdatePreferences
ECHO.   X.      134     UpdateEmailPreferences
ECHO.   Y.      135     UpdateBankDetails



CHOICE /C %CHOICE% /M "CHOOSE AN OPTION"    
SET "Option=%ERRORLEVEL%"

rem here scan for correct letter
FOR /L %%a IN (0,1,35) DO if %%a==%Option% set idx=%%a
rem small correction of index
set /A idx-=1
set Option=!Choice:~%idx%,1!

FOR /F "TOKENS=1-4 DELIMS=. " %%A IN ('FINDSTR/BC:"ECHO.  " "%~f0"'
     ) DO (IF "%%B"=="%Option%" (SET "Name=%%C" & SET "Code=%%D" & echo activated %Option%: !Name!,!Code!)
)

Notes:

  • I needed to enable delayed expansion back
  • I set CHOICE in a variable at the start, nicer to propose the choice and then scan into it for correct letter/digit
Jean-François Fabre
  • 137,073
  • 23
  • 153
  • 219
  • Hi,This is going to be simple question i hope but where is it setting the source and the target folder in the script? please advise. thank you for your help so far. – anallyexcel Oct 13 '16 at 22:52
  • I am attempting to work out how your script incorporates the following: – anallyexcel Oct 13 '16 at 22:54
  • SET "Option=%ERRORLEVEL%" FOR /F "TOKENS=1-4 DELIMS=. " %%A IN ('FINDSTR/BC:"ECHO. " "%~f0"' ) DO IF "%%B"=="%Option%" (SET "Name=%%C" & SET "Code=%%D") FOR /F "DELIMS=" %%A IN ( 'FINDSTR/MISC:"%customerID%" "%sourceFolder%\*"^|FINDSTR/MIF:/ /C:"%Name%"' ) DO COPY "%%A" "%targetFolder%" PAUSE – anallyexcel Oct 13 '16 at 22:54
  • OK. I'll check that tonight. – Jean-François Fabre Oct 14 '16 at 08:55
0

May I suggest a different approach based on arrays that run faster and is simpler to keep updated?

@ECHO OFF
MODE CON:COLS=100 LINES=50
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

(SET sourceFolder=C:\Users\Administrator\Desktop\test)
(SET targetFolder=C:\Users\Administrator\Desktop\test2)

SET /P "customerID=Enter Customer ID: "

REM Assemble the data arrays
set i=0
set "options="
FOR /F "TOKENS=1-4 DELIMS=. " %%A IN ('FINDSTR/BC:"ECHO.  " "%~f0"') DO (
   set /A i+=1
   set "options=!options!%%B"
   SET "Name[!i!]=%%C"
   SET "Code[!i!]=%%D"
)

:MENU
CLS
ECHO=
ECHO= ..................................................
ECHO= PLEASE SELECT THE OPTION FROM THE EVENT MENU BELOW
ECHO= ..................................................

ECHO    Option Number       Event Number        Event Name
ECHO/
ECHO.   0.      101     NewCustomer
ECHO.   1.      102     ExisingCustomer
ECHO.   2.      103     LockedAccount
ECHO.   3.      104     DeleteAccount
ECHO.   4.      105     ExpireSession
ECHO.   5.      106     PasswordUpdated
ECHO.   6.      107     PasswordReset
ECHO.   7       108     HackedAccount
ECHO.   8.      109     UpdateProfile
ECHO.   9.      110     UpdateLists
ECHO.   A.      111     NewPurchase
ECHO.   B.      112     ExisingSale
ECHO.   C.      113     AmendOrder
ECHO.   D.      114     AmendDelivery
ECHO.   E.      115     CancelOrder
ECHO.   F.      116     OvernightFiles
ECHO.   G.      117     DailyFiles
ECHO.   H.      118     HelpFlies
ECHO.   I.      119     FraudAccount
ECHO.   J.      120     DeadCustomer
ECHO.   K.      121     WelcomeEmail
ECHO.   L.      122     OrderEmail
ECHO.   M.      123     OrderAmmended
ECHO.   N.      124     NoRemainingStock
ECHO.   O.      125     ReplenishStock
ECHO.   P.      126     SalesQuery
ECHO.   Q.      127     UpdateFirstName
ECHO.   R.      128     UpdateSurname
ECHO.   S.      129     UpdateAddress
ECHO.   T.      130     UpdateDateOfBirth
ECHO.   U.      131     UpdateContactNo
ECHO.   V.      132     UpdateEmail
ECHO.   W.      133     UpdatePreferences
ECHO.   X.      134     UpdateEmailPreferences
ECHO.   Y.      135     UpdateBankDetails



CHOICE /C %options% /M "CHOOSE AN OPTION"
SET "Option=%ERRORLEVEL%"
SET "Name=!Name[%Option%]!" & SET "Code=!Code[%Option%]!"

FOR /F "DELIMS=" %%A IN (
    'FINDSTR/MISC:"%customerID%" "%sourceFolder%\*"^|FINDSTR/MIF:/ /C:"%Name%"'
    ) DO COPY "%%A" "%targetFolder%"

PAUSE
Community
  • 1
  • 1
Aacini
  • 65,180
  • 12
  • 72
  • 108
0

As an alternative:

@ECHO OFF
MODE CON:COLS=50 LINES=50
SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION

(SET sourceFolder=C:\test)
(SET targetFolder=C:\test2)

SET /P "customerID=Enter Customer ID: "

:MENU
"SET _="
CLS
ECHO=
ECHO= ................................................
ECHO= PLEASE SELECT THE EVENT CODE FROM THE MENU BELOW
ECHO= ................................................
ECHO=
ECHO=     Event Code  -=-  Event Name
ECHO=
ECHO.            101  ---  NewCustomer
ECHO.            102  ---  ExisingCustomer
ECHO.            103  ---  LockedAccount
ECHO.            104  ---  DeleteAccount
ECHO.            105  ---  ExpireSession
ECHO.            106  ---  PasswordUpdated
ECHO.            107  ---  PasswordReset
ECHO.            108  ---  HackedAccount
ECHO.            109  ---  UpdateProfile
ECHO.            110  ---  UpdateLists
ECHO.            111  ---  NewPurchase
ECHO.            112  ---  ExisingSale
ECHO.            113  ---  AmendOrder
ECHO.            114  ---  AmendDelivery
ECHO.            115  ---  CancelOrder
ECHO.            116  ---  OvernightFiles
ECHO.            117  ---  DailyFiles
ECHO.            118  ---  HelpFlies
ECHO.            119  ---  FraudAccount
ECHO.            120  ---  DeadCustomer
ECHO.            121  ---  WelcomeEmail
ECHO.            122  ---  OrderEmail
ECHO.            123  ---  OrderAmmended
ECHO.            124  ---  NoRemainingStock
ECHO.            125  ---  ReplenishStock
ECHO.            126  ---  SalesQuery
ECHO.            127  ---  UpdateFirstName
ECHO.            128  ---  UpdateSurname
ECHO.            129  ---  UpdateAddress
ECHO.            130  ---  UpdateDateOfBirth
ECHO.            131  ---  UpdateContactNo
ECHO.            132  ---  UpdateEmail
ECHO.            133  ---  UpdatePreferences
ECHO.            134  ---  UpdateEmailPreferences
ECHO.            135  ---  UpdateBankDetails
ECHO=

SET/P "PICK= > "
FOR /F "EOL=F TOKENS=2-3 DELIMS=.- " %%A IN ('FIND " --- " "%~f0"') DO (
    IF %PICK%==%%A (SET "_=T"
        FOR /F "DELIMS=" %%C IN (
            'FINDSTR/MISC:"%customerID%" "%sourceFolder%\*"
            ^|FINDSTR/MIF:/ /C:"%%B"') DO COPY "%%C" "%targetFolder%")) 
IF NOT DEFINED _ GOTO :MENU

TIMEOUT -1
Compo
  • 36,585
  • 5
  • 27
  • 39