批量获取文件中的字符串

时间:2012-02-19 23:00:29

标签: windows filter batch-file compare

CMD中的任务。

1)如何比较字符串是否在字符串中?我检查了手册here的“布尔测试”字符串是否存在?“”但是我无法理解这个例子或它对我不起作用。这段代码,只是一个尝试。如果某行中有标记<a>,我会尝试对过滤器进行字符串比较。

FOR /f "tokens=* delims= usebackq" %%c in ("%source%") DO ( 
echo %%c
IF %%c == "<a" (pause) 
)

因此,当我读取文件时,如果某一行上有链接,则应暂停。

2)我还有一个问题。如果链接中有特定文件,我需要过滤该行,并获取链接的内容。我最初的想法是尝试将findstr与正则表达式一起使用,但似乎不使用子模式。接下来的问题是如何将结果变为变量。

set "pdf=0_1_en.pdf"
type "%source%" | grep "%pdf%" | findstr /r /c:"%pdf%.*>(.*).*</a>"

总而言之,我想浏览文件,如果有这样的链接:已修复: *

<a href="/Dokumenter/dsweb/Get/Document-408/EK_GEN_0_1_en.pdf" class="uline"><b>GEN 0.1 Preface</b></a>
  • 我忘了将其设置为代码,因此代码内部未显示。遗憾。
  • 警告:我们不知道路径,只知道基本文件名。

获得标题GEN 0.1前言。但是你应该知道,同样的链接也有类似的链接,它们包含图像,而不是标记内的文本。

根据Aacini的代码稍作修改:

@echo off
setlocal EnableDelayedExpansion
set "source=GEN 0 GENERAL.html"
set "pdf=0_1_en.pdf"
echo In file:%source%
echo Look for anchor:%pdf%

rem Process each line in %source% file:
for /F "usebackq delims=" %%c in ("%source%") do (
   set "line=%%c"
   rem Test if the line contain a "tag" that start with "<a" string:
   set "tag=!line:*<a=!"
   if not "!tag!" == "!line!" (
      rem Take the string in tag that end in ">"
      for /F "delims=^>" %%a in ("!tag!") do set "link=%%a"
      echo Link found: !link!
      if "!link!" == "GEN 0.1 Preface" echo Seeked link found
   )
)
pause

仍未完成

3 个答案:

答案 0 :(得分:1)

虽然你的问题很广泛但并没有提供太多的细节,所以我假设了几点,因为我不太了解.PDF文件,标签等。

@echo off
setlocal EnableDelayedExpansion
set "source=GEN 0 GENERAL.html"
set "pdf=0_1_en.pdf"
echo In file: "%source%"
echo Look for anchor: "%pdf%"

rem Process each line in %source% file:
for /F "usebackq delims=" %%c in ("%source%") do (
   set "line=%%c"
   rem Test if the line contain "<a>" tag:
   set "tag=!line:*<a>=!"
   if not "!tag!" == "!line!" (
      rem Test if "<a>" tag contain the anchor pdf file:
      if not "!tag:%pdf%=!" == "!tag!" (
         rem Get the value of "<b>" sub-tag
         set "tag=!tag:<b>=$!"
         set "tag=!tag:</b>=$!"
         for /F "tokens=2 delims=$" %%b in ("!tag!") do set title=%%b
         echo Title found: "!title!"
      )
   )
)
pause

如果您向我提供有关它们的详细信息,可以添加或修复任何缺失点。

编辑:我在OP的最后指示后修复了上面的程序。我使用$ character来获取Title值;如果此标记可能存在于原始标记中,则必须由另一个未使用的标记更改。

我用这个“GEN 0 GENERAL.html”示例文件测试了这个程序:

Line one
<a>href="/Dokumenter/EK_GEN_0_X_en.pdf" class="uline"><b>GEN 0.X Preface</b></a>
Line three
<a>href="/Dokumenter/EK_GEN_0_1_en.pdf" class="uline"><b>GEN 0.1 Preface</b></a>
Line five

得到这个结果:

In file: "GEN 0 GENERAL.html"
Look for anchor: "0_1_en.pdf"
Title found: "GEN 0.1 Preface"

编辑添加了更快的方法

有一种更简单,更快速的方法可以解决这个问题,但如果一行包含多个标记,则可能会失败:

@echo off
setlocal EnableDelayedExpansion
set "source=GEN 0 GENERAL.html"
set "pdf=0_1_en.pdf"
echo In file: "%source%"
echo Look for anchor: "%pdf%"

for /F "delims=" %%c in ('findstr /C:"<a>" "%source%" ^| findstr /C:"%pdf%"') do (
   set "tag=%%c"
   rem Get the value of "<b>" sub-tag
   set "tag=!tag:<b>=$!"
   set "tag=!tag:</b>=$!"
   for /F "tokens=2 delims=$" %%b in ("!tag!") do set title=%%b
   echo Title found: "!title!"
)
pause

答案 1 :(得分:0)

首先,一个重要问题:这是否必须通过CMD脚本实现?您是否可以使用VBScript,PowerShell,C#或其他一些脚本/编程语言? CMD是一个臭名昭着的痛苦脚本环境。

其次,我不确定这是否能回答你的问题 - 这有点不清楚 - 但是这里有一个快速的技巧,你可以用它来查看CMD中是否包含另一个子字符串:

setlocal enableextensions enabledelayedexpansion

set PATTERN=somepattern

for /f "delims=" %%f in (somefile.txt) do (
    set CURRENT_LINE=%%f
    if "!CURRENT_LINE:%PATTERN%=!" neq "!TEMP!" (
        echo Found pattern in line: %%f
    )
)

您的想法是尝试执行字符串替换并查看是否有任何更改。这肯定是一个黑客攻击,如果你可以使用像findstrgrep这样的工具,那将是更好的选择,但是如果你的选择有限,那么上面的内容应该可行。

注意:我实际上并没有运行上面的脚本摘录,所以如果你有任何困难,请告诉我。

答案 2 :(得分:0)

我已经修改了这样做的方法。我意识到最好先找到pdf文件的名称。这是我几乎完成的解决方案,但我问你是否可以帮我解决最后一点。最后一个替换语句不起作用,因为我需要删除结束标记b。只是为了获得头衔。

@echo off
setlocal EnableDelayedExpansion
set "source=GEN 0 GENERAL.html"
set "pdf=0_1_en.pdf"
echo In file:%source%
echo Look for anchor:%pdf%

rem Process each line in %source% file:
for /F "usebackq delims=" %%c in ("%source%") do (
   set "line=%%c"
   REM Test if the line contains pdf file I look for:
   SET "pdfline=!line:%pdf%=!"


   if not "!pdfline!" == "!line!" (

      cls     
      echo Line: !line!

      REM Test if the pdfline contains tag b
      SET "tagline=!pdfline:*><b>=!"

      if not "!tagline!" == "!pdfline!" (

         cls     
         echo ACTUAL LINE: !tagline!

         REM Remove closing tag b
         SET "title=!tagline:</b*=!"
         echo  TITLE: !title!
         pause
      )
   )
)
pause

顺便说一句: 我使用的html页面是here

所以我请你帮忙完成/修复专线SET "title=!tagline:</b*=!"