【问题标题】:FINDSTR in FOR loop with variables as strings (Batch File)FOR循环中的FINDSTR,变量为字符串(批处理文件)
【发布时间】:2014-06-25 17:28:25
【问题描述】:

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

我正在编写一个小程序,当在文本文件中找到字符串时,它会移动文本和 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 循环中运行它,但它仍然没有使用我的字符串和路径变量。

提前感谢您的帮助! 带着敬意 黑融合

【问题讨论】:

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


    【解决方案1】:

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

    第一项是逻辑设计问题。让我们假设批次按预期工作。 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% 出现在复合语句(或“块”)中- 如果 FOR...DO (in here)IF...(here) ELSE (or here) 被替换为该变量的值在解析最外面的语句时 - 在它执行之前,则在括号内。如果调用 delayedexpansion(如您有) 那么!var! 指的是run-time 值,%var% 指的是parse-time 值。

    因此,if "%errorlevel%"=="0" 在解析 for...%%A 时将根据 errorlevel 的状态进行评估,而不是 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)

    【讨论】:

    • Magoo,谢谢你的精彩解释!现在这很有意义。编写批处理脚本并不容易,但因为我只需要一个简单的程序来移动文件,所以编写它就足够了。
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多