Windows Batch - 如何创建具有唯一值集的数组?

问题描述 投票:0回答:1

我在批处理中乱七八糟,编写代码循环遍历目录中的文件并将文件名的最后四个字符添加到数组中。 问题是我的数组中有重复项。 有没有办法只将值添加到尚不存在的数组中?

@echo off
setlocal enableDelayedExpansion
set i=0
for %%f in (*00.DIF) do (
  set fname=%%~nf
  set year=!fname:~-4!
  ::echo !year!
  set Obj[!i!].name=!year!
  set /a i=!i!+1
)
set lastindex=!i!

for /L %%f in (0,1,!lastindex!) do ( 
  echo !Obj[%%f].name!
)
arrays batch-file cmd duplicates unique
1个回答
0
投票
  1. 如前所述,在块语句

    (a parenthesised series of statements)
    中,应使用
    REM
    语句而不是破碎标签注释形式 (
    :: comment
    ),因为标签终止块,容易混淆
    cmd
    ::
    是一个损坏的标签,因为您无法使用
    ::
    到达
    goto
    ,但它仍然是一个标签。

  2. 使用

    set "var=value"
    设置字符串值 - 这可以避免尾随空格引起的问题。不要分配
    "
    或终端反斜杠或空格。从元素构建路径名 - 与直觉相反,它可能会使过程变得更容易。使用
    set /a var=value
    设置数值。

  3. 我更喜欢避免 ADFNPSTXZ (在任何一种情况下)作为元变量(循环控制变量) ADFNPSTXZ 也是元变量修饰符,可能会导致难以发现的错误 (请参阅文档提示中的

    for/f

  4. 仅需要使用

    !var!
    语法来访问
    var
    的修改值,其中
    var
    在代码块(带括号的命令序列)内变化。

因此,重写代码:

@ECHO OFF
setlocal enableDelayedExpansion
set /A i=0
SET "chosen="
REM for %%e in (*00.DIF) do (
for %%e in (1234 0011 4567 7890 0011 4183) do (
  set fname=%%~ne
  set year=!fname:~-4!
  REM echo !year!
  set Obj[!i!].name=!year!
  set /a i+=1
  SET "unaltered=Y"
  FOR %%y IN (!chosen!) DO IF DEFINED unaltered IF "%%y"=="!year!" (
  SET "unaltered="
   set /a i-=1
   set "Obj[!i!].name="
  )
  IF DEFINED unaltered SET "chosen=!year! !chosen!"
)
set /a lastindex=i-1

for /L %%e in (0,1,%lastindex%) do ( 
  echo !Obj[%%e].name!
)
GOTO :EOF

新变量

chosen
设置为

我已将您的第一个

for
循环替换为一个仅处理一系列数字以进行测试的循环。我还将
metavariable
f
更改为
e

使用更现代的语法来递增

i
。请参阅 docco 的提示或无尽的 SO 项目中的
set/?

%%y
上的新循环可在
chosen
中搜索先前分配的值。请注意使用
unaltered
作为布尔值 - 它要么定义为
Y
要么未定义。如果已定义,只需反转
i
的增量并删除分配的“数组”字符串值即可。 使用布尔值

然后,如果

year
中的值是新的,则定义
unaltered
并将
year
的新值附加到
chosen
中的值列表中。

处理整个列表后,

lastindex
设置为
i
- 1,因为
i
指向下一个要填充的元素。

© www.soinside.com 2019 - 2024. All rights reserved.