我正在比较两个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!]! (哪个不起作用) 有人可以帮忙。
答案 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