FOR循环中的FINDSTR,变量为字符串(批处理文件)

时间:2014-06-25 17:28:25

标签: variables batch-file for-loop batch-processing

这是我在这里的第一篇文章,不幸的是向你提问而不是帮助。

我正在编写一个小程序,当在文本文件中找到字符串时会移动文本和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

1 个答案:

答案 0 :(得分:4)

唉。不止一个问题,什么是合适的解决方案?

第一项是逻辑设计问题。让我们假设批次按预期工作。 c!vidx!将设置为%%Ap!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将根据解析findstrsetlocal 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}}