我正在制作一个批处理脚本,其中我需要向用户询问输入。从用户获得输入后,它现在将获得值并在数组中搜索它。如果它在里面,它将继续进行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
以上只是一个示例,但我一直面临的问题是,当用户输入带有空格的输入时,它会退出程序,它不会读取有效输入,即使它是数组中的确切值,它仍然不读它。
问题的直接原因是批处理有时对布局非常敏感。
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]
which 执行一个子程序breakit[2]
。冒号指定子例程在 label 处是内部的(在此批处理中):breakit[2]
(并且期望它将以goto :eof
或终止exit[/b]
)。如果缺少冒号,即使当前代码中存在标签,也会尝试运行可执行文件 。breakit[2]
:breakit[2]
最后一个问题是,如果code
包含一个Space,==
则将尝试与code contents
加载到数组中的每个字符串进行匹配。None 将匹配,因为数组中的字符串都不包含空格。
如果打算在任何(空格,逗号,分号)分隔的字符串中找到code
匹配项,array
则必须匹配单个字符串;因此使用 afor
来迭代 中的字符串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
注意:对于 a metavariable
(a 中的循环控制变量for
或例程中的参数号 %0..%9),在检索其值时~
直接包括在变量名(%%~s
或%~1
)之前将删除"
任何封闭的双引号"
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句