循环内的数组的BATCH比较不起作用

时间:2014-11-28 14:53:15

标签: arrays loops batch-file cmd

我正在比较两个pdf文件夹。 首先,我检查哪些文件是新文件,并将所有新文件重新保存在一个数组中:

setlocal enabledelayedexpansion
FOR /F "delims=. tokens=1" %%I IN ('dir "%Rev2Dir%\*.pdf" /b') DO (
    if not exist "%Rev1Dir%\%%I.pdf" (
        IF NOT EXIST new.txt (
            ECHO %%I new > new.txt
        ) ELSE (
            ECHO %%I new >> new.txt
        )
        ECHO %%I.pdf ^(new^)
        copy "%Rev2Dir%\%%I.pdf" "%Rev1Dir%\%%I.pdf"
        set /A i=i+1
        set anew[!i!]=%%I
    )
)

这很好用。我可以用以下内容显示所有这些文件:

set k=%i%
for /L %%i in (1,1,%k%) do echo file number %%i: "!anew[%%i]!"

现在它变得棘手了。 在另一个循环中,我检查整个第一个文件夹,并且需要知道该文件是否是新的:

FOR /F "delims=. tokens=1" %%I IN ('dir "%Rev1Dir%\*.pdf" /b') DO (
    IF EXIST "%Rev2Dir%\%%I.pdf" (  
        echo file is %%I
        echo j is !j!
        if "%%I" == "!anew[%j%]!" (
            set /A j=j+1
            ECHO %%I.pdf ^(new^)            
        ) Else (
            echo do someting
        )

)

问题是,那个!重新[%j%]!仍然是新的[1]。变量j不会更新。 对于我的回声它工作正常。所以我想我需要这样的东西!重新[!j!]! (哪个不起作用) 有人可以帮忙。

3 个答案:

答案 0 :(得分:2)

我怀疑你的整个剧本比需要的更复杂。但我并不完全明白你的最终目标,所以我没有任何更好的建议。

但是有一种非常简单的方法可以解决现有代码中的直接问题。

您已经在使用延迟扩展,因为常规扩展不会显示循环中的当前值。但是当您尝试!anew[%j%]!时,您需要两个级别的扩展。但%j%首先遭遇导致延迟扩张的问题。诀窍是将j值传递给FOR变量。

替换此行:

        if "%%I" == "!anew[%j%]!" (

用这个:

        for %%j in (!j!) do if "%%I" == "!anew[%%j]!" (

答案 1 :(得分:0)

FOR /F "delims=. tokens=1" %%I IN ('dir "%Rev1Dir%\*.pdf" /b') DO (
 IF EXIST "%Rev2Dir%\%%I.pdf" (  
  echo file is %%I
  set "found="
  for /f "tokens=1*delims==" %%m in ('set anew[ 2^>nul') do if "%%I" == "%%m" set found=Y
  if defined found ECHO %%I.pdf ^(new^)            
  ) Else (
   echo do someting
  )
 )
)

应该适合你。它检查任何envvar从anew[开始,以查找与%%I的匹配,如果我发现将found设置为非空。 if defined对目标变量的运行时值进行操作。

答案 2 :(得分:0)

但是我看到了详尽无遗的Magoo的回答......间接变量地址:

而不是所有失败的尝试(例如!anew[%j%]!!anew[!j!]!(或%!的所有其他组合)都适用于下一种方法:

set anewref=anew[!j!]
call :indirect "anewval=%%!anewref!%%"
echo j !j!, anewref !anewref!, anewval !anewval!


goto :eof
:indirect
  set %~1
exit /B