powershell - Windows CLI bruger FINDSTR til kun at returnere alt efter strengen

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har min CLI forespørgsel indstillet til:


c:>findstr /c:"TOTAL" Invoice.txt 
TOTAL 80:00


Men jeg vil kun søgeforespørgslen til at returnere alt efter forespørgslen:


80.00


Også hvis jeg bruger wild i filnavnet, returneres hele filnavnet og linjen. Jeg vil gerne have det igen, at kun returnere alt efter strengen og ikke filnavnet, da jeg vil røre resultaterne i en tekstfil.


c:>findstr /c:"TOTAL" *.txt
Invoice - Copy (2).txt:TOTAL 120.00
Invoice - Copy (3).txt:TOTAL 110.00
Invoice - Copy (4).txt:TOTAL 100.00
Invoice - Copy.txt:TOTAL 90.00
Invoice.txt:TOTAL 80.00


Ideelt set løber jeg min kommando og får bare følgende


120.00
110.00
100.00
90.00
80.00


Idéer om hvordan man gør dette? Powershell eller CMD er fint. I øjeblikket skal jeg sætte alt sammen i et batch script, men et ps script ville fungere.


Tak!

Bedste reference


For at få output fra en kommando, brug en for /f loop:


for /f "tokens=2" \%\%a in ('findstr /c:"TOTAL" *.txt') do echo \%\%a


Givet, dine data er altid som dit eksempel (linje er nøjagtigt TOTAL xxx.xx og der er ingen andre TOTAL i filerne (muligvis vil bruge findstr /b))


(batch-syntaks. Hvis du vil bruge det direkte på kommandolinjen, skal du erstatte alle \%\%a med \%a)


REDIGER lidt mere kompliceret med mellemrum i filnavne. Gør det i to trin: Først få den rene dataopdeling ved : ("tokens=2 delims=:" \%\%a) og i en anden for opdelt efter plads (standard afgrænser) ("tokens=2" \%\%b):


for /f "tokens=2 delims=:" \%\%a in ('findstr "TOTAL" *.txt') do (
  for /f "tokens=2" \%\%b in ("\%\%a") do echo \%\%b
)


(lidt mere kode, men bedre end at messe med de oprindelige data (omdøbe filer))

Andre referencer 1


Bare min 2 cent ;-). Den første for kan være en simpel, bare for at gentage filnavne.


@Echo off
( For \%\%A in (*.txt
  ) Do For /f "tokens=2" \%\%B in ('findstr /B /C:"TOTAL" "\%\%A"'
  ) Do Echo:\%\%B
) >All-Totals.txt

Andre referencer 2


Også let i PowerShell.


PS C:src	> Get-Content .Invoice.txt | Where-Object { $\_ -match '.*TOTAL (.*)' } | \% { $matches[1] }
120.00
110.00
100.00
90.00
80.00

PS C:src	> cat .Invoice.txt | where { $\_ -match '.*TOTAL (.*)' } | \% { $matches[1] }
120.00
110.00
100.00
90.00
80.00

Andre referencer 3




Et for /F loop kan fange output fra kommandolinjen findstr. Efter at have gemt hver linje i en miljøvariabel, kan substrengsudskiftning påføres således, at alt op til og med : + TOTAL + SPACE bliver fjernet: [[[24] [25]


setlocal EnableDelayedExpansion
for /F "delims=" \%\%L in ('findstr /C:"TOTAL" "*.txt"') do (
    set "LINE=\%\%L"
    echo(!LINE:*:TOTAL =!
)
endlocal