我正在制作一个批处理脚本,我需要询问用户输入。在获得用户的输入后,它将获得值并在数组内搜索它。如果它在里面,它将进入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
上面只是一个示例,但我遇到的问题是,当用户输入带有空格的输入时它会退出程序,即使它是内部的确切值,它也不会读取有效输入。数组仍然无法读取它。
答案 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
)