批处理脚本:将数组值与数值进行比较

时间:2018-05-20 09:20:22

标签: batch-file

总体目标是我想编写一个批处理脚本,我可以传递两个参数 - 一个AD组,以及一个包含用户列表的文本文件的位置。完成的数据将被传递到另一个系统中的API以导入以管理其他组,如邮件列表等。

困难在于:我希望将数组值与批处理脚本中的数字变量进行比较,而不使用延迟扩展,最好是。

这将允许我创建一个“气泡比较”,我可以根据现有文件中已有的值检查每个新条目,然后将条目附加到主列表,或者如果它已经存在则不执行任何操作。< / p>

我试图在不使用延迟扩展的情况下执行此操作。在我看来,如果不延迟扩展,也许不能以这种方式使用数组。是否可以在不利用延迟扩展的情况下比较递增的数组值?

FOR /L %%a IN (0,1,9) DO (
CALL SET numbers[%%a%%]=%%a
)
SET /A i=0
:startLoop
IF "%numbers[%i%]%" EQU "%i%" DO (
ECHO "%i% exists!"
set /A i=%i%+1
GOTO startLoop
)
ELSE ( ECHO "The list has finished at %i%")

1 个答案:

答案 0 :(得分:2)

您的代码中存在一些问题:

  • call set numbers[%%a%%]=%%a应该阅读set "numbers[%%a]=%%a"(此处不需要call);
  • do条款中没有if;
  • if "%numbers[%i%]%" equ "%i%"尝试展开(不存在的)变量numbers[]; call if "%%numbers[%i%]%%" equ "%i%"不起作用call无法与if一起使用;但你可以call set "interim=%%numbers[%i%]%%"然后if "%interim%" equ "%i%";
  • set /A i=%i%+1应阅读set /A "i+=1";
  • ) else (必须在一行中;

总而言之,这意味着:

for /L %%a in (0,1,9) do (
    set "numbers[%%a]=%%a"
)
set /A "i=0"
:startLoop
call set "interim=%%numbers[%i%]%%"
if "%interim%" equ "%i%" (
    echo %i% exists
    set /A "i+=1"
    goto :startLoop
) else (
    echo The list has finished at %i%
)