如何将数字映射到变量

时间:2016-10-09 16:18:26

标签: batch-file

我有以下脚本,但我想将数字映射到变量,但不知道如何。因此,如果用户输入0,我希望它搜索事件名称NewUser。

    @echo off           
    mode con:cols=40 lines=40           
    set /p customerID="Enter Customer ID: "         
    CLS         
    :MENU           
    ECHO.           
    ECHO ...............................................            
    ECHO PLEASE SELECT THE EVENT FROM THE MENU BELOW            
    ECHO ...............................................            
    ECHO.           
    ECHO    Event Code  Event Name  
    ECHO.           
    ECHO    0       NewUser
    ECHO    1       ExistingUser
    ECHO    2       EmailAdded
    ECHO    3       AccountProblem
    ECHO    4       Lost
    ECHO.           
    SET /P event=Type the event code and then press ENTER:          
    IF %event%==0 set event=NewUser GOTO find           
    IF %M%==1 set event=ExistingUser GOTO find          
    IF %M%==2 set event=EmailAdded GOTO find            
    IF %M%==3 set event=AccountProblem GOTO find            
    IF %M%==4 set event=Lost GOTO find          
    pause           
    :find           
    pause           
    setlocal enableextensions disabledelayedexpansion           
    pause           
        set "sourceFolder=C:\test"          
        set "targetFolder=C:\test2"         
    pause           
        set "customerID=%customerID%"           
        set "NewUser=%Event%"           
    pause           
        for /f "delims=" %%a in ('          
            findstr /m /s /l /c:"%customerID%" "%sourceFolder%\*"           
            ^| findstr /f:/ /m /l /c:"%event%"          
        ') do (         
           copy "%%~fa" "%targetFolder%"            
        )           
    pause           

2 个答案:

答案 0 :(得分:1)

像这样改变你的For循环并重新测试:

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

修改

我添加了脚本的修改版本,以包含三位数事件代码的新要求。只需根据需要在脚本中调整它的值,(第19行到第23行)

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

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

SET /P "customerID=Enter Customer ID: "

:MENU
CLS
ECHO=
ECHO= ..................................................
ECHO= PLEASE SELECT THE OPTION FROM THE EVENT MENU BELOW
ECHO= ..................................................
ECHO=
ECHO=      Option      Event Name      Event Code
ECHO=
ECHO.        1.         NewUser           A00
ECHO.        2.       ExistingUser        A01
ECHO.        3.        EmailAdded         A02
ECHO.        4.      AccountProblem       A03
ECHO.        5.           Lost            A04
ECHO=

CHOICE /C 12345 /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

请确保%sourceFolder%是完整路径且%targetFolder%已存在,(请参阅第6行)

答案 1 :(得分:1)

您的代码的第一个版本比当前版本更接近正确的解决方案;您需要使用两个嵌套的for /F循环,如下所示:

for /f "delims=" %%a in ('
  findstr /I /m /s /l /c:"%customerID%" "%sourceFolder%\*.txt" 
') do for /f "delims=" %%A in ('
    findstr /I /m /l /c:"%event%" "%%~fa" 
      ') do (
         rem 'copy' command is merely displayed using ECHO for debugging purposes
         ECHO copy "%%~fa" "%targetFolder%"
      )

下一步评论代码段可以帮助改进脚本:

@ECHO OFF
SETLOCAL EnableExtensions DisableDelayedExpansion

set "customerID="
:customerID
set /p customerID="Enter Customer ID: "
if not defined customerID goto :customerID
REM instead of above test, you could apply next statement about `set /P`:
REM    If the user does not enter anything (just presses return) 
REM    then the variable will be unchanged and an ERRORLEVEL will be set. 

rem CLS
:MENU
ECHO.
ECHO ...............................................
ECHO PLEASE SELECT THE EVENT FROM THE MENU BELOW
ECHO ...............................................
ECHO.
ECHO    Event Code  Event Name
ECHO.
ECHO    0           NewUser
ECHO    1           ExistingUser
ECHO    2           EmailAdded
ECHO    3           AccountProblem
ECHO    4           Lost
ECHO.
REM SET /P M=Type the event code and then press ENTER:
choice /C 01234 /M "Type the event code"
REM 0 means that an user's reply to "Terminate batch job (Y/N)?" was not "y" 
IF %ERRORLEVEL% EQU 0 echo "Ctrl-C" or "Ctrl-Break" pressed&goto :NoSearch
REM 255 means another error
IF ERRORLEVEL 255 goto :MENU
REM  ERRORLEVEL number Specifies a true condition if the last program run
REM                    returned an exit code EQUAL TO OR GREATER THAN the number
REM                    specified.
IF ERRORLEVEL 1 set "event=NewUser"
IF ERRORLEVEL 2 set "event=ExistingUser"
IF ERRORLEVEL 3 set "event=EmailAdded"
IF ERRORLEVEL 4 set "event=AccountProblem"
IF ERRORLEVEL 5 set "event=Lost"
REM Note that in above code, ERRORLEVEL parameters are tested in INCREASING order
REM Used only in this special case
REM           (no need of GOTO statement, 'event' variable is set correctly)
REM 
REM although CHOICE /? says:
REM    When you use ERRORLEVEL parameters in a batch program, 
REM    list them in decreasing order.


:NOTE

set "sourceFolder=D:\test"
set "targetFolder=D:\test2"

rem ??? set "customerID=%customerID%"
rem ??? set "event=%event%"

rem debugging output 
echo looking for "customerID=%customerID%" "event=%event%"

for /f "delims=" %%a in ('
  findstr /I /m /s /l /c:"%customerID%" "%sourceFolder%\*.txt" 
') do for /f "delims=" %%A in ('
    findstr /I /m /l /c:"%event%" "%%~fa" 
      ') do (
         rem 'copy' command is merely displayed using ECHO for debugging purposes
         ECHO copy "%%~fa" "%targetFolder%"
      )
:NoSearch
pause