2016-10-09 5 views
0

다음 스크립트가 있지만 숫자를 변수에 매핑하고 싶지만 방법을 모르겠습니다. 따라서 사용자가 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   
+0

당신이 %의 targetfolder에 복사 찾고있는 것을 설명해 주시겠습니까 :

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%" ) 

다음 코드 스크립트를 개선하는 데 도움이 수 주석 : 다음과 같이 두 개의 중첩 된 for /F 루프를 사용할 필요가 %. 1. "% customer % %"문자열에 "% event %"문자열과 일치하는 내용이 포함 된 파일. 2. 문자열에 "% customerID %"및 "% event %"문자열이 모두 들어있는 파일 3. 다른 것. – Compo

+0

예 내용에 문자열이 모두 들어있는 파일을 복사하려고합니다. – anallyexcel

답변

1

코드의 첫 번째 버전이 현재 버전보다 정확한 해결책에 더 가깝습니다.

@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/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 
+0

안녕하세요, 그것은 완벽하게 작동하지만 더 잘 작동하도록하려면 3 자리 이벤트 코드가 필요합니다. 당신이 친절하게 제공 한 현재의 해결책으로 이것이 가능한가? – anallyexcel

1
은 다음과 같이 루프를 들어 당신을 변경하고 다시 테스트

: 나는 세 자리의 이벤트 코드의 새로운 요구 사항을 포함하는 스크립트의 수정 된 버전을 추가 한

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 %의이 이미 존재 %, (라인 여섯 참조) 있는지 확인하십시오.

+0

불행히도 그게 작동하지 않았다 : ( – anallyexcel

+0

첫 번째'findstr' (cf.'/M' 매개 변수)에서 파일의 마지막'findstr'이 파이프로 연결된 ** 이름 **이 작동하지 못했습니다. 루프를 참조하십시오 [내 대답] (http://stackoverflow.com/a/39948255/3439404). – JosefZ

+1

그 설명을 설명해 주시겠습니까 @ JosefZ. 그의 findstr 나를 감각을 만들었습니다, 그래서 난 그냥 루프로 작동하도록 포맷 % customerID % s를 포함하는 파일의 이름을 다른 findstr에 파이프로 연결하여 콘솔의 파일 목록으로 두 번째 findstr이 일치하는 파일 이름에 % event %가 들어있는 파일 이름을 출력합니다. – Compo

관련 문제