windows - Få streng fra fil i batch

Indlæg af Hanne Mølgaard Plasc

Problem



Opgave i CMD.


1) Hvordan kan jeg sammenligne, om streng er i streng? Jeg kontrollerede manuel her for 'Boolean Test' eksisterer streng? '' Men jeg kan ikke forstå eksemplet eller det virker ikke for mig. Dette stykke kode, det er bare et forsøg. Jeg forsøger at lave en streng sammenlignet med filtrer nogle sting, hvis der er et mærke <a> i en linje. [16]


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


Så mens jeg læser en fil, skal den være pauset, hvis der er et link på en linje.


2) Jeg har en mere spørge. Jeg ville skulle filtrere linjen, hvis der er en bestemt fil i linket, og få indholdet af linket. Min oprindelige ide var at forsøge at bruge findstr med regex, men det ser ud til ikke at bruge sub-mønstre. Og næste problem ville være, hvordan man får resultatet til variabel.


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


Så jeg vil opsøge filen, og hvis der er et link som dette: REPAIRED: *


<a href="/Dokumenter/dsweb/Get/Document-408/EK\_GEN\_0\_1\_en.pdf" class="uline"><b>GEN 0.1 Preface</b></a>



  • Jeg har glemt at style dette som en kode, så indersiden af ​​kode blev ikke vist. Undskyld.

  • Advarsel: vi kender ikke stien, kun det grundlæggende filnavn.



Få titlen GEN 0.1 Forord. Men du bør vide, at der også er lignende links med samme link, som indeholder billede, ikke en tekst inde i et tag.


Kode ifølge Aacini skal ændres lidt:


@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


Stadig ikke færdig

Bedste reference


Selv om dit spørgsmål er omfattende, giver det ikke meget detaljer, så jeg antog flere punkter, fordi jeg ikke ved for meget om .PDF-filer, tags osv.


@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


Ethvert manglende punkt kan tilføjes eller fastgøres, hvis du giver mig præcise detaljer om dem.


REDIGER : Jeg har fastsat programmet ovenfor efter sidste indikationer fra OP. Jeg brugte $ tegn til at få titelværdien; Hvis dette tegn kan eksistere i originalt Tag, skal det ændres af en anden ubrugt.


Jeg testede dette program med denne 'GEN 0 GENERAL.html' eksempelfil:


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


og få dette resultat:


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


REDIGER : Ny hurtig metode tilføjet


Der er en enklere og hurtigere metode til at løse dette problem, som dog kan mislykkes, hvis en linje indeholder mere end et tag:


@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

Andre referencer 1


For det første et vigtigt spørgsmål: skal dette virkelig gennemføres via et CMD script? Vil du kunne gå med VBScript, PowerShell, C # eller noget andet scripting/programmeringssprog? CMD er et notorisk smertefuldt scripting miljø.


For det andet er jeg ikke sikker på om dette svarer på dit spørgsmål - det er lidt uklart - men her er et hurtigt trick, du kan bruge til at se i CMD for at se, om en given streng indeholder en anden substring:


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


Ideen er, at du forsøger at udføre streng udskiftning og se om noget er ændret. Dette er helt sikkert et hack, og det ville være at foretrække, hvis du i stedet kunne bruge et værktøj som findstr eller grep, men hvis du er begrænset i dine muligheder, skal noget som ovenstående fungere.


BEMÆRK: Jeg har faktisk ikke kørt ovenstående scriptuddrag, så lad mig vide, hvis du har problemer med det.

Andre referencer 2


Jeg har ændret måden at gøre det på. Jeg indså, at det er bedre at finde navnet på pdf-dokumentet først. Dette er min næsten færdige løsning, men jeg spørger dig om du kunne hjælpe mig med det sidste punkt. Den sidste erstatning erklæring virker ikke, fordi jeg skal fjerne lukke tag b. Bare for at få titlen.


@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


BTW:
Html-siden jeg arbejder sammen med, er her. [17]


Så jeg beder dig om at hjælpe med at fuldføre/reparere linje SET "title=!tagline:</b*=!"