如何在循环中使用findstr?

时间:2014-09-12 09:42:42

标签: batch-file command-line-arguments findstr

我正在尝试读取文件名,并根据文件名设置Output变量。

我已经尝试直接在findstr上使用%%F (findstr /i "M002" %%F >nul 2>&1 )并写入临时文本文件(如下所示)来测试和阅读它,但没有任何效果。

我做错了什么?

P.S。如果我从循环中删除它,代码可以正常工作,但由于最后一行,我需要在循环中使用它。

rem ===========================================

set FileType=pdf

for %%F in (%~dp0*.%FileType%) do (
  rem ECHO %%F

  echo "%%F" > test.txt
  findstr /i "M002" test.txt >nul 2>&1
  echo %errorlevel%
  if not %errorlevel% == 0 (
      echo "4pp"
      echo %%F
      set Output=4PP
  ) ELSE (
      echo "Letter"
      echo %%F
      set Output=Letter
  )

  set NetComm="XYZ" "%Output%" etc etc etc
)

rem ====================================

1 个答案:

答案 0 :(得分:1)

delayedexpansion的第5,961代。

批处理从for到最后一个右括号的整个语句,并在语句时将任何 %var%替换为该变量的值被解析

因此,尝试使用在循环内建立的值将失败。这适用于当前实例中的%output%%errorlevel%

轻松处理%errorlevel%。语法

if errorlevel n

适用于errorlevel运行时值,如果errorlevel设置为n更高,则为true比n

就个人而言,我发现if not condition ... else笨拙。我不明白为什么它如此常见。在我的书中模糊思考......

有三种常见的方法可以克服这个问题,每种方法都有自己的优点和缺点,支持者和批评者。

首先,“记录”方法。使用setlocal enabledelayedexpansion指令。执行此说明后,!var!将访问当前值,并%var% 初始 value of var`。

二,子程序方法。循环中的CALL :sub执行子例程(请参阅文档 - 提示中的call /?),在该子例程中,%var%将具有在循环内建立的值。

第三,有时可以使用call echo %%var%%(或call someotherinsructioncall执行目标,就像它是一个子程序一样。

因此,在您的情况下,修复可能是

rem ===========================================

set FileType=pdf

for %%F in (%~dp0*.%FileType%) do (
  rem ECHO %%F

  findstr /i "M002" "%%F" >nul 2>nul
  CALL echo %%errorlevel%%
  if errorlevel 1 (
      echo "4pp"
      echo %%F
      set Output=4PP
  ) ELSE (
      echo "Letter"
      echo %%F
      set Output=Letter
  )

  CALL set NetComm="XYZ" "%%Output%%" etc etc etc
)

rem ====================================

完全取决于你对“作品”的定义(这不是绝对的 - 它只对你有意义。)