如何在批处理脚本中的数组中搜索用户给定的特定值

卡尔·格瓦拉

我正在制作一个批处理脚本,其中我需要向用户询问输入。从用户获得输入后,它现在将获得值并在数组中搜索它。如果它在里面,它将继续进行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 metavariablea 中的循环控制变量for或例程中的参数号 %0..%9),在检索其值时~直接包括在变量名(%%~s%~1之前将删除"任何封闭的双引号"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在批处理文件中查找当前用户是否属于特定用户组?

如何在批处理脚本中从 JSON 数组文件中迭代对象

如何在批处理脚本中运行Powershell脚本和批处理脚本?

如何使用批处理在 .txt 文件中搜索特定短语

如何在php脚本中打印特定的json数组值?

如何在批处理中读取CSV文件特定列中的值?

如何在批处理文件脚本中循环打印程序的返回值?

检查批处理脚本中的用户输入

如何在 Spring Boot 中搜索乘法(批处理)参数?

如何在Windows中获取批处理脚本的路径?

如何在Shell脚本中批处理文件?

如何在批处理脚本中增加循环变量?

如何在批处理脚本中在 curl 中转义管道?

如何在批处理脚本中查找PC名称?

如何在批处理脚本中包含或循环

如何在批处理文件中传递用户输入?

如何在给定范围内搜索多维数组中的最大值

如何在批处理文件中运行脚本后的特定天数后永久删除特定文件

如何在MongoDB中搜索数组值

如何在数组中搜索值?

如何在JavaScript数组中搜索值?

如何在属性中搜索特定值?

批处理脚本以在SVN修订文件中搜索特定的字符串

需要批处理脚本来搜索和复制网络驱动器中的特定文件

如何在批处理文件中显示变量的值?

如何使用 % 或 ! 在批处理脚本中

如何在批处理脚本中计算特定文件的哈希值?

在数组中搜索给定值的索引

如果没有指定键,如何在 jq 中给定条件打印数组的特定值