这是我在这里的第一篇文章,不幸的是向你提问而不是帮助。
我正在编写一个小程序,当在文本文件中找到字符串时会移动文本和pdf文件。(1.txt,1.txt.pdf ...)当我手动设置变量时它工作得非常好像这样批处理:
set c1=xxx
set p1=c:\test\xxx\
set c2=yyy
set p2=c:\test\yyy\
FOR /f "tokens=*" %%A IN ('FINDSTR /i /m "%c1%" "c:\test\*.txt"') DO (
IF "%ERRORLEVEL%"=="0" MOVE %%A "%p1%">nul
MOVE %%A.pdf %p1%
FOR /f "tokens=*" %%A IN ('FINDSTR /i /m "%c2%" "c:\test\*.txt"') DO (
IF "%ERRORLEVEL%"=="0" MOVE %%A "%p2%">nul
MOVE %%A.pdf %p2%
现在我尝试使用带变量的输入文件:
for /F "delims=^ tokens=1,2" %%A in (c:\test\db\input.cdb) do (
SET /A vidx=!vidx! + 1
set c!vidx!=%%A & set p!vidx!=%%B
它运行良好,但是当我尝试为所有这些变量使用for循环时问题就开始了。逐字搜索所有(c1,c2,c3 ......)变量并将它们移动到(p1,p2,p3,...)路径。
Input.cdb如下所示:
xxx ^ c:\test\xxx
yyy ^ c:\test\yyy
代码:
setlocal ENABLEDELAYEDEXPANSION
set vidx=0
for /F "delims=^ tokens=1,2" %%A in (c:\test\db\input.cdb) do (
SET /A vidx=!vidx! + 1
set c!vidx!=%%A & set p!vidx!=%%B
FOR /f "tokens=*" %%D IN ('FINDSTR /i /m "%c!vidx!%" "c:\test\*.txt"') DO (
IF "%ERRORLEVEL%"=="0" MOVE %%D "%p!vidx!%">nul
MOVE "%%D.pdf" "%p!vidx!%"
ECHO %%D File is being procesed now
)
)
我不知道为什么这段代码不起作用,可能是因为循环中存在循环? 或者如何创建循环来执行相同的操作,从0到已从input.cdb读取多少行变量?
我试图在临时变量的单独for循环中运行它,但它仍然没有使用我的字符串和路径变量。
提前感谢您的帮助! 带着敬意 Blackfusion
答案 0 :(得分:4)
唉。不止一个问题,什么是合适的解决方案?
第一项是逻辑设计问题。让我们假设批次按预期工作。 c!vidx!
将设置为%%A
,p!vidx!
设置为%%B
,因此,除非c...
和p...
有一些未发布的用途,你可以简单地替换如下:
setlocal ENABLEDELAYEDEXPANSION
for /F "delims=^ tokens=1,2" %%A in (c:\test\db\input.cdb) do (
FOR /f "tokens=*" %%D IN ('FINDSTR /i /m "%%A" "c:\test\*.txt"') DO (
IF "%ERRORLEVEL%"=="0" MOVE %%D "%%B">nul
MOVE "%%D.pdf" "%%B"
ECHO %%D File is being procesed now
)
)
现在 - 关于%var%
var
%ERRORLEVEL%
是任何变量(包括%C!vidx!%
和%VAR%
...)的常见基本误解 - a {{1发生在复合语句中(或"阻止") - 如果FOR...DO (in here)
或IF...(here) ELSE (or here)
被该变量的值替换为delayedexpansion
或!var!
,则在括号内解析最外层语句的时间 - 在执行之前。如果调用run-time
(就像你一样),则%var%
引用parse-time
值和if "%errorlevel%"=="0"
到errorlevel
值。
因此,for...%%A
将根据解析findstr
时setlocal ENABLEDELAYEDEXPANSION
for /F "delims=^ tokens=1,2" %%A in (c:\test\db\input.cdb) do (
FOR /f "tokens=*" %%D IN ('FINDSTR /i /m "%%A" "c:\test\*.txt"') DO (
IF not errorlevel 1 MOVE %%D "%%B">nul
MOVE "%%D.pdf" "%%B"
ECHO %%D File is being procesed now
)
)
的状态进行评估,而不是IF not errorlevel 1
设置的值。
可以通过
更正if the CURRENT (run-time) errorlevel is NOT (1 or greater than 1)
其中{{1}}被解释为{{1}}