如何在批处理脚本

时间:2017-10-18 01:08:16

标签: batch-file

我正在制作一个批处理脚本,我需要询问用户输入。在获得用户的输入后,它将获得值并在数组内搜索它。如果它在里面,它将进入goto。如果失败,则转到另一个goto

以下是我的代码示例

@echo off
set "Array[0]=830486600"
set "Array[1]=832180943"
set "Array[2]=867672488"
set "Array[3]=851091583"
set "Array[4]=105670350"
set "Array[5]=871749063"
set "Array[6]=831425861"
set "Array[7]=833386470"
set "Array[8]=845221250"
set "Array[9]=839863683"
set "Array[10]=837778733"
set "Array[11]=866184944"
set "Array[12]=863514631"
set "Array[13]=868073035"
set "Array[14]=841618088"
set /p code=Enter code: 

for /F "tokens=2 delims==" %%s in ('set Array[') do (
    if "%code%" == "%%s"(
        goto breakit
    )else (
        goto breakit2
    )
)
pause


:breakit
echo inside!
pause
goto eof


:breakit2
echo not inside
pause
goto eof

上面只是一个示例,但我遇到的问题是,当用户输入带有空格的输入时它会退出程序,即使它是内部的确切值,它也不会读取有效输入。数组仍然无法读取它。

2 个答案:

答案 0 :(得分:1)

问题的直接原因是批次有时对布局非常敏感。

if "%code%" == "%%s"(
如果"%code%" == "%%s"('

完全被视为' - 第二个字符串被解释为包含 (,批次看不到"好吧,如果字符串匹配怎么办?"。

解决方案是添加像 Space

这样的分隔符
if "%code%" == "%%s" (

(同样地,虽然)else有效,但else(不起作用,因此) else (通常是使用的格式)

下一个问题:goto将执行转移到目标标签。它不提供返回,因此在第一次比较之后,执行传输:breakit[2],然后从那里继续。结果可能是breakit然后继续breakit2

不适用于goto eof。您的代码中没有标签:eof(也不应该存在) - 特定的语法goto :eof(带冒号)表示go to end-of-physical-file终止例程

因此,您需要执行子程序call :breakit[2]的{​​{1}}。冒号指定子例程在标签breakit[2]处是内部的(在批处理内)(期望它将以:breakit[2]goto :eof终止)。如果缺少冒号,即使当前代码中存在标签exit[/b],也会尝试运行可执行文件 breakit[2]

最后一个问题是,如果:breakit[2]包含 Space ,那么code将尝试将==与加载到数组中的每个字符串进行匹配。 None将匹配,因为数组中的所有字符串都不包含空格。

如果在code contents(空格,逗号,分号)分隔的字符串中的任何code中的字符串匹配,则意图找到匹配项字符串必须匹配;因此使用array来迭代for中的字符串。

现在这意味着是的,你找到一个匹配 - 毫无疑问,报告哪些子串匹配而不是简单地报告找到匹配将是有用的。为此,您需要将找到匹配项的字符串传递给code并累积找到的字符串。

:breakit

注意:对于@ECHO OFF SETLOCAL set "Array[0]=830486600" set "Array[1]=832180943" set "Array[2]=867672488" set "Array[3]=851091583" set "Array[4]=105670350" set "Array[5]=871749063" set "Array[6]=831425861" set "Array[7]=833386470" set "Array[8]=845221250" set "Array[9]=839863683" set "Array[10]=837778733" set "Array[11]=866184944" set "Array[12]=863514631" set "Array[13]=868073035" set "Array[14]=841618088" set /p code=Enter code: SET "found=" for /F "tokens=2 delims==" %%s in ('set Array[') do ( FOR %%c IN (%code%) DO ( if "%%c" == "%%s" ( call :breakit "%%s" ) else ( call :breakit2 ) ) ) IF DEFINED found ECHO strings found : %found% goto :eof :breakit echo inside! (%1) SET "found=%found% %1" goto :eof :breakit2 echo not inside goto :eof metavariable中的循环控制变量或例程中的参数编号%0 ..%9),包括变量前面的for -name(~%%~s)在检索其值时会删除%~1任何封闭的双引号"

答案 1 :(得分:0)

如果将所需的值移动到下标中,您可以大大简化代码,即:

@echo off
setlocal

set "Array[830486600]=1"
set "Array[832180943]=1"
set "Array[867672488]=1"
set "Array[851091583]=1"
set "Array[105670350]=1"
set "Array[871749063]=1"
set "Array[831425861]=1"
set "Array[833386470]=1"
set "Array[845221250]=1"
set "Array[839863683]=1"
set "Array[837778733]=1"
set "Array[866184944]=1"
set "Array[863514631]=1"
set "Array[868073035]=1"
set "Array[841618088]=1"
set /p code=Enter code: 

if defined Array[%code%] (
   echo inside
) else (
   echo not inside
)