使用FINDSTR在FOR循环中设置变量

时间:2017-03-02 18:58:12

标签: windows batch-file

(已编辑)如何从文本文件中读取数据并将其中的某些部分分配给变量?例如,在下面的行中,我想将数据分配给指定的变量,但忽略标题行,前言词" DATA:"和任何引号。

HEADER (ignore)
  DATA:  "set text inside quotes to VAR1"
  DATA:  "set text inside quotes to VAR2"
  DATA (etc.)

我使用的代码是:

setlocal enabledelayedexpansion
set COUNT=0
for /f "usebackq delims=" %%a in ("data.txt") do (
  set "INPUT=%%a"
  set /a COUNT=!COUNT!+1
  echo !INPUT! | findstr /i /c:"HEADER" > nul 
  if errorlevel 1 (
    set "INPUT=!INPUT:DATA:=!"
    set "INPUT=!INPUT:"=!"
    set VAR!COUNT!=!INPUT!
    echo Variable !COUNT! = !VAR!!COUNT!
  )
)

我的预期输出是

Variable 1 = set text inside quotes to VAR1
Variable 2 = set text inside quotes to VAR2

但我得到的是

Variable 2 = 2
Variable 3 = 3
Variable 4 = 4

我做错了什么?

1 个答案:

答案 0 :(得分:2)

我拿了你的代码并修好了。 特别是:

  • 我切换findstr以查找与HEADER
  • 不匹配的所有行
  • 我使用数组来存储变量。

可能需要进行一些小调整才能完全按照您的意愿进行调整,但我想我已经给了您一个有用的工作大纲。


@echo off 
setlocal enabledelayedexpansion
set COUNT=0
for /f "tokens=*" %%a in ('findstr /i /v HEADER data.txt') do (
  set "INPUT=%%a"
  set /A COUNT=!COUNT!+1
  set "INPUT=!INPUT:DATA:=!"
  set VAR[!COUNT!]=!INPUT!
  call echo Variable !COUNT! = %%VAR[!COUNT!]%%
)

<强>输出

Variable 1 =   "set text inside quotes to VAR1"
Variable 2 =   "set text inside quotes to VAR2"
Variable 3 = DATA (etc.)

<小时/> 要匹配具有前导空格的行,请使用开关:

findstr /V /R /C:"^ *HEADER" 

正则表达式意味着:

^       : Beginning of line
[space] : a literal space
*       : the previous character (space) repeated as many times as needed
HEADER  : the text to find after leading spaces

开关意味着:

  • /R使用正则表达式
  • /C:使用此搜索字符串
  • /V显示与此表达式不匹配的所有行。