Получить строку из файла в пакете - PullRequest
0 голосов
/ 20 февраля 2012

Задача в CMD.

1) Как я могу сравнить, если строка в строке?Я проверил руководство здесь для «Boolean Test» существует ли строка? »« Но я не могу понять пример или он не работает для меня.Этот кусок кода, это просто попытка.Я пытаюсь сравнить строку фильтра с каким-нибудь строкой, если в строке есть тег <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>"

Итак, в общем, я хочу просмотреть файл и, если есть такая ссылка: REPAIRED: *

<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 ]

1 голос
/ 20 февраля 2012

Хотя ваш вопрос обширный, он не дает много подробностей, поэтому я предположил несколько моментов, потому что я не слишком много знаю о файлах .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

Любая недостающая точка может быть добавлена ​​или исправлена, если вы дадите мне точную информацию о них.

РЕДАКТИРОВАТЬ : я исправил программу выше после последних указаний от ОП. Я использовал символ $, чтобы получить значение заголовка; если этот символ может существовать в оригинальном теге, он должен быть заменен другим неиспользованным тегом.

Я протестировал эту программу с этим примером файла "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
0 голосов
/ 21 февраля 2012

Я изменил способ сделать это.Я понял, что лучше сначала найти название документа 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-страница, с которой я работаю, это здесь .

Поэтому я прошу вас помочь завершить / отремонтировать линию SET "title=!tagline:</b*=!"

0 голосов
/ 20 февраля 2012

Во-первых, один важный вопрос: действительно ли это должно быть реализовано с помощью сценария 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
    )
)

Идея состоит в том, что вы пытаетесь выполнить замену строки и посмотреть, было ли что-то изменено.Это, конечно, хак, и было бы предпочтительнее, если бы вы могли вместо этого использовать инструмент, такой как findstr или grep, но если вы ограничены в своих возможностях, что-то вроде выше должно работать.

ПРИМЕЧАНИЕ. На самом деле я не запускал приведенный выше фрагмент скрипта, поэтому дайте мне знать, если у вас есть какие-либо трудности с ним.

...