Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 如何将数字映射到变量_Batch File - Fatal编程技术网

Batch file 如何将数字映射到变量

Batch file 如何将数字映射到变量,batch-file,Batch File,我有下面的脚本,但我想将数字映射到变量,但不知道如何映射。因此,如果用户输入0,我希望它搜索事件名称NewUser @echo off mode con:cols=40 lines=40 set /p customerID="Enter Customer ID: " CLS :MENU ECHO. ECHO .....

我有下面的脚本,但我想将数字映射到变量,但不知道如何映射。因此,如果用户输入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           

像这样更改For循环并重新测试:

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

我已经添加了您的脚本的修改版本,以包括三位数事件代码的新要求。只要根据需要调整脚本中的值(第十九行到第二十三行)

@ECHO关闭
模式CON:COLS=52行=40行
SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
(设置sourceFolder=C:\test)
(设置targetFolder=C:\test2)
设置/P“customerID=输入客户ID:”
:菜单
CLS
回音=
回声=。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
ECHO=请从下面的事件菜单中选择该选项
回声=。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
回音=
ECHO=选项事件名称事件代码
回音=
回声。1.新用户A00
回声。2.现有用户A01
回声。3.电子邮件添加了A02
回声。4.会计问题A03
回声。5.损失A04
回音=
CHOICE/C 12345/M“选择选项”
设置“选项=%ERRORLEVEL%”
对于/F“TOKENS=1-4 DELIMS=。”%%A IN('FINDSTR/BC:'ECHO.”“%~f0”'
)如果“%%B”==%Option%”(设置“名称=%%C”和设置“代码=%%D”),则执行此操作
对于/F“DELIMS=”%%A IN(
'FINDSTR/MISC:'%customerID%'%sourceFolder%\*“^ FINDSTR/MIF://C:'%Name%'
)是否将“%%复制到”“%targetFolder%”
暂停

请确保%sourceFolder%是完整路径,并且%targetFolder%已经存在(请参见第六行)。

像这样更改For循环,然后重新测试:

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

我已经添加了您的脚本的修改版本,以包括三位数事件代码的新要求。只要根据需要调整脚本中的值(第十九行到第二十三行)

@ECHO关闭
模式CON:COLS=52行=40行
SETLOCAL ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
(设置sourceFolder=C:\test)
(设置targetFolder=C:\test2)
设置/P“customerID=输入客户ID:”
:菜单
CLS
回音=
回声=。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
ECHO=请从下面的事件菜单中选择该选项
回声=。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
回音=
ECHO=选项事件名称事件代码
回音=
回声。1.新用户A00
回声。2.现有用户A01
回声。3.电子邮件添加了A02
回声。4.会计问题A03
回声。5.损失A04
回音=
CHOICE/C 12345/M“选择选项”
设置“选项=%ERRORLEVEL%”
对于/F“TOKENS=1-4 DELIMS=。”%%A IN('FINDSTR/BC:'ECHO.”“%~f0”'
)如果“%%B”==%Option%”(设置“名称=%%C”和设置“代码=%%D”),则执行此操作
对于/F“DELIMS=”%%A IN(
'FINDSTR/MISC:'%customerID%'%sourceFolder%\*“^ FINDSTR/MIF://C:'%Name%'
)是否将“%%复制到”“%targetFolder%”
暂停

请确保%sourceFolder%是完整路径,并且%targetFolder%已经存在(参见第六行)。

您的代码的第一个版本比当前版本更接近正确的解决方案;您需要为/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

代码的第一个版本比当前版本更接近正确的解决方案;您需要为/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

请解释一下您希望复制到%targetfolder%的内容。1.名称包含字符串“%customerID%”的文件,其内容与字符串“%event%”匹配。2.其内容同时包含字符串“%customerID%”和“%event%”3的文件。有些不同。是的,我正在复制一个内容同时包含两个字符串的文件。请您解释一下要复制到%targetfolder%的内容好吗。1.名称包含字符串“%customerID%”的文件,其内容与字符串“%event%”匹配。2.其内容同时包含字符串“%customerID%”和“%event%”3的文件。有些不同。是的,我正在复制一个内容同时包含两个字符串的文件。它无法工作,因为最后一个
findstr
是从第一个
findstr
开始的文件管道名称(参见
/M
参数)。您需要两个嵌套循环,请参见。请您解释一下@JosefZ的注释。他的findstr对我来说很有意义,所以我只是把它格式化成一个循环。应该将包含%customerID%s的文件名作为文件列表从控制台通过管道传输到另一个findstr,第二个findstr将输出内容包含%event%的匹配文件名。我已经测试了findstr示例,作为@JosefZ注释的结果。我可以证实,它的工作非常好,因为我猜测和张贴。但是,如果您的文件名或路径包含空格,我不确定第二个findstr是否会从控制台正确读取它们,并且您的单个循环将失败。如果是这种情况,那么根据已经提供的备选答案,需要两个循环。它不起作用,也不能真正帮助我帮助你。我看了一下您的findstr示例,它是由MC ND提供给您的,我认为唯一的潜在问题可能是它的格式,但是在测试中也发现它是正确的@JosefZ肯定是错的,我也对照包含空格的路径检查了它,并且发现它工作得很好,尽管我以前有过怀疑。我在代码中看到的唯一潜在问题是,如果%sourceFolder%不是完整的“驱动器:\path”(尽管您的问题指出不是这样)。您好,Compo我无法让它使用0-9中的10个以上选项?有指针吗?它无法工作,因为最后一个
findstr
是从第一个
findstr
开始的文件管道名称(参见
/M
参数)。您需要两个嵌套循环,请参见。您能解释一下@J注释吗