在文本文件中查找字符串并使用Windows批处理设置变量

时间:2015-05-25 10:05:53

标签: windows batch-file numbers line

我有一个名为hdd_list.txt的文件。

Index: 0
Device Name: \Device\Harddisk0\Partition0
Drive: entire disk
Label: 
Type: Harddisk
Size: 55.899GB

Index: 1
Device Name: \Device\Harddisk0\Partition1
Drive: C:\
Label: 
Type: Harddisk
Size: 55.897GB

Index: 2
Device Name: \Device\Harddisk1\Partition0
Drive: entire disk
Label: 
Type: Harddisk
Size: 465.761GB

Index: 3
Device Name: \Device\Harddisk1\Partition1
Drive: E:\
Label: Backup
Type: Harddisk
Size: 465.758GB

我需要检索与“c:\”对应的Index数字,然后减去1减去整个磁盘的Index

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

尝试下一个类似数组的方法:

@ECHO OFF >NUL
SETLOCAL enableextensions enabledelayedexpansion
set /A "ii=-1"
For /F "usebackq tokens=1* delims=:" %%G in (
        "D:\bat\StackOverflow\files\30435794.txt") do (
    if /I "%%~G"=="Index" set /A "ii+=1"
    For /F "tokens=*" %%# in ("%%~H") do set "auxH=%%~#"
    set "__%%~G[!ii!]=!auxH!"

    if /I "!auxH!"=="C:\" set /A "__indexC=!ii!-1"

  )
set __ | findstr /I /L "[%__indexC%]"

ENDLOCAL
goto :eof

<强>输出

==>D:\bat\StackOverflow\30435794.bat
__Device Name[0]=\Device\Harddisk0\Partition0
__Drive[0]=entire disk
__Index[0]=0
__Size[0]=55.899GB
__Type[0]=Harddisk

==>

资源(必读):

答案 1 :(得分:0)

@echo off
setlocal

set "Index="
for /F "tokens=2" %%a in ('findstr "Index: Drive:" hdd_list.txt') do (
   if not defined Index (
      set /A Index=%%a-1
   ) else (
      if /I "%%a" equ "C:\" (
         goto diskFound
      ) else (
         set "Index="
      )
   )
)
:diskFound
echo The index for entire disk C:\ is: %Index%

答案 2 :(得分:0)

我会使用JREPL.BAT - 一个纯脚本(混合JScript /批处理)正则表达式文本处理实用程序,可以在XP以后的任何Windows机器上本机运行。

@echo off
for /f %%N in (
  'jrepl "Index: (\d+)\r?\n.*\nDrive: C:\\" "$1-1" /jmatch /m /f hdd_list.txt'
) do set "index=%%N"

我使用/M选项允许跨多行搜索,/JMATCH选项仅返回匹配项,并将替换字符串指定为JScript表达式(从值中减去1)。

搜索会查找索引行,捕获数字,然后是任意行,后跟Drive: C\行。