newline
Goto Top

Zeichen zählen, um Zeilenläge zu begrenzen

Guten Morgen,

in diesem Forum finden sich so coole Scripts, es ist unfassbar klasse!

Mit einem sehr gut funktionierenden Script (aus der guten alten Zeit) gibt es aber das Problem, dass nur Semikl. gefunden werden und keine Gesamtzeichenanzahl ausgegeben wird.

Problem:
Ich muss htm-Dateien überprüfen. Dabei soll in keiner Datei die Zeichenlänge einer Zeile von x überschritten werden (incl. Leerzeichen).
Die Ausgabe würde mir reichen, indem die Zeilen einfach aufgelistet würde (so wie im alten Script).
Fragen:
Wie lässt sich der Code anpassen?
Gibt es ansonsten eine einfache Alternative? Wie sieht die aus?

@echo off & setlocal
set "Datei=test.htm"  
set "Suche=;"  
set /a Anz=2

set G=%temp%\GNO.vbs
>%G% echo Set rE=New RegExp:rE.Pattern="%Suche%":rE.Global=True:WScript.Echo rE.Execute(WScript.Arguments(0)).Count  

for /f "tokens=1* delims=:" %%i in ('findstr /n "%Suche%" "%Datei%"') do  (  
    for /f %%a in ('cscript //nologo %G% "%%j"') do (  
        if %%a gtr %Anz% echo %%j
    )
)

Gruß newline

Content-Key: 666002

Url: https://administrator.de/contentid/666002

Printed on: April 20, 2024 at 14:04 o'clock

Member: Doskias
Solution Doskias Apr 22, 2021 updated at 07:40:22 (UTC)
Goto Top
Moin,

ich würde dir zu Powershell raten. Da du offenbar nicht ganz so bewandert darin bist, hier ein für Anfänger verständlicher Code, der theoretisch noch kürzer sein könnte, allerdings habe ich dann Angst, dass du ihn nicht verstehst. Daher einmal für dich Schrittweise:
# Datei Auswählen
$Datei="C:\temp\irgendwas.htm"  
# Maximale Zeichenlänge pro Zeile auswählen
$max_zeichen=1000
$Zeilen_counter=0
# Datei einlesen
$Datei_Inhalt=get-content $Datei

# Inhalt Zeilenweise durchgehen
foreach ($Zeile in $Datei_Inhalt)
{$zeilen_counter++
# Ausgabe der Zeilennummer wenn der festgelegte Wert überschritten ist
if ($zeile.length -gt $max_zeichen) {write-host "Zeile $zeilen_counter hat die maximal Größe überschritten mit "$zeile.length " Zeichen"]}  
}

Gruß
Doskias
Member: newline
newline Apr 22, 2021 at 08:15:09 (UTC)
Goto Top
Hey Doskias,

klasse!!!
Du hast natürlich recht, dass ich nicht so bewandert bin - andernfalls wäre ich nicht hier ... ๐Ÿ˜Ž.

Deine ausführlich Darstellung ist richtig nett von dir, zumal ich eigene Anpassungen vornehmen kann und ihn vermutlich auch in 6 Wochen noch verstehe!

Einziges Problem war eine fehlende Ausgabe, wenn ich die Datei einfach starte (vermutlich müsste sie auf der Console gestartet werden).
Da ich weitere Aufgaben anschließe, lasse ich sie einfach aus einer Batch heraus starten:
powershell.exe -ExecutionPolicy Bypass -File "zaehlen.ps1"  

Ergebnis spitze, Danke Doskias ๐Ÿ˜‰
Member: Doskias
Doskias Apr 22, 2021 at 08:29:00 (UTC)
Goto Top
Zitat von @newline:
Hey Doskias,
klasse!!!
Du hast natürlich recht, dass ich nicht so bewandert bin - andernfalls wäre ich nicht hier ... ๐Ÿ˜Ž.
Stimmt nicht. Hier treiben sich viele Leute herum, die bewandert sind. Auch Leute mit Erfahrung können nicht alles wissen und dürfen Fragen stellen.

Deine ausführlich Darstellung ist richtig nett von dir, zumal ich eigene Anpassungen vornehmen kann und ihn vermutlich auch in 6 Wochen noch verstehe!
Und vielleicht bis dahin auch noch ein wenig in Powershell eingearbeitet hast ? face-smile

Einziges Problem war eine fehlende Ausgabe, wenn ich die Datei einfach starte (vermutlich müsste sie auf der Console gestartet werden).
Da ich weitere Aufgaben anschließe, lasse ich sie einfach aus einer Batch heraus starten:
> powershell.exe -ExecutionPolicy Bypass -File "zaehlen.ps1"  
> 

Ich persönlich bin keine Freund von einer Abfolge von Aufgaben via Batch zu starten. Als Faustregel kannst du dir einfach merken, dass die PS-Konsole alles kann, was die CMD kann und noch weit mehr. die Powershell ISE die du auch finden solltest beitet darüber hinaus komfortablere Möglichkeiten zur Skripterstellung als die CMD. Zum Beispiel das Ausführen eines markierten Teiles des Codes, was sich hervorragend zum Testen einzelner Abschnitte eignet.

Du könntest die Ausgabe auch in eine Datei umleiten, was je nach länge der Dateien die Auswertung vereinfacht (oder du schickst die Datei dann einfach jemanden zum weiterbearbeiten).

Ergebnis spitze, Danke Doskias ๐Ÿ˜‰
Gerne
Mitglied: 148121
148121 Apr 22, 2021 updated at 09:00:31 (UTC)
Goto Top
Und falls du dann mal mit Powershell etwas weiter bist hier noch ergänzend eine kurze Variante
$max=1000
Select-String 'C:\temp\irgendwas.htm' -Pattern ".{$($max+1)}" | select -Expand LineNumber  
Das .{$($max+1),} bedeutet in Regex Syntax selektiere alle Zeilen die $max + 1 beliebige Zeichen oder mehr besitzen. Ausgegeben werden dann nur die Zeilennummern der gefundenen Zeilen.
Etwas zu Lesen darüber Quantifizierer in regulären Ausdrücken

Gruß w.
Member: newline
newline Apr 22, 2021 at 09:03:56 (UTC)
Goto Top
Da hast du schon wieder recht ...
Wobei mein Problem war, dass nach "Mit Powershell ausführen" nix passierte ๐Ÿ˜ข und ich mir dann einfach selber helfen wollte - um nicht eine Anschlussfrage stellen zu müssen. So bekam ich zumindest die Ausgabe im CMD präsentiert, wobei mir vollkommen klar ist, dass es weitaus komfortabler gehen muss - nur wie, bleibt mir vorerst verborgen.

Da ich eher mit kleinere Aufgaben betraut bin ist PS natürlich eine riesige Herausforderung, wobei ich vieles schon damit versuche zu erledigen.
Btw., mir ist vollkommen unklar, wie sich verschiedene Codeblöcke miteinander kombinieren lassen - das war in Batch irgendwie so schön einfach ๐Ÿ˜‚. ABER das ist selbstverständlich eine umfassende Frage für einen anderen Thread!!!
Hast du trotzdem ein Tipp, wo man zur Verknüpfung von Codeblöcken weitere Infos/Tuts/Beispiele finden kann? Die MS-Seite bietet zwar megaviele Infos, aber für Einsteiger - finde ich - fehlt es an einfachen Beispielen. Also im Sinne, wie schreibe ich ein kleines Programm mit mehreren Ablaufschritten. Oder sind es dann mehrere Dateien/Scripte, die quasi am Anfang aufgerufen werden können?
Also, falls du noch einen Tipp hast: FREUDE, FREUDE falls nicht: DANKE, DANKE noch einmal für deine Mühe!!!
Member: Doskias
Doskias Apr 22, 2021 at 09:14:48 (UTC)
Goto Top
Du "brauchst" so gesehen in PS keine Codeblöcke. Beispiel

gpupdate

macht halt nur ein Update der Gruppenrichtlinie

get-Date
Zeigt dir einfach das aktuelle Datum mit der aktuellen Uhrzeit an

get-Date
gpupdate

würde demnach erst die Uhrzeit hinschreiben, danach das gpupdate machen. Das Skript wird einfach von oben nach unten abgearbeitet. Wenn du in Zeile 4 eine Variable deklarierst und Sie bis Zeile 4000 unangetastet lässt, macht er halt was dazwischen steht und nimmt dann ab Zeile 4.000 die Variable.
Jeder Befehl macht das was er soll und das sind die Befehle die MS erklärt werden. Sie zu kombinieren und sinnvoll zu nutzen, das ist dann dein Job ;)
Member: Doskias
Doskias Apr 22, 2021 at 09:18:54 (UTC)
Goto Top
Also dann mach es doch gleich als Einzeiler und Pack das Max auch nach unten face-smile

Select-String 'C:\temp\irgendwas.htm' -Pattern ".{1000}" | select -Expand LineNumber  

Aber genau das meinte ich im ersten Posting mit theoretisch noch kürzer aber als Anfänger nicht so verständlich und nur die Zeilen Ausgeben ist zwar das Ergebnis schöner ist es aber mit einem kleinen Text 8finde ich persönlich)
Mitglied: 148121
148121 Apr 22, 2021 updated at 09:28:18 (UTC)
Goto Top
Zitat von @Doskias:

Also dann mach es doch gleich als Einzeiler und Pack das Max auch nach unten face-smile
Ja klar ... Korinthen kacken face-big-smile .... Sollte für den TO dann doch noch "minimale" Hilfe darstellen face-smile.

Select-String 'C:\temp\irgendwas.htm' -Pattern ".{1000}" | select -Expand LineNumber  
Der zeigt dann aber nur Zeilen die mind. 1000 Zeichen haben MAX + 1 wäre hier nötig wenn 1000 noch erlaubt sind face-wink
Aber genau das meinte ich im ersten Posting mit theoretisch noch kürzer aber als Anfänger nicht so verständlich und
War ja nur ne Ergänzung des Threads ...

Zurück Kortinthe gekackt face-big-smile

Gruß w.
Member: Lochkartenstanzer
Lochkartenstanzer Apr 22, 2021 at 10:06:17 (UTC)
Goto Top
Moin,

Die mit awk/gawk geht es recht einfach :

 awk ' { print length " " $0 }  ' <eingabedatei

z.B.

nas-trovje:~/tmp> awk ' { print length ": " $0 }  ' <lorem-impsum.txt 
17: Lorem ipsum dolor
20: sit amet, consetetur
26: sadipscing elitr, sed diam
32: nonumy eirmod tempor invidunt ut
16: labore et dolore
24: magna aliquyam erat, sed
29: diam voluptua. At vero eos et
41: accusam et justo duo dolores et ea rebum.
42: Stet clita kasd gubergren, no sea takimata
67: sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
0: 

lks
Member: newline
newline Apr 22, 2021 at 10:33:55 (UTC)
Goto Top
Ihr seid herrlich!
Den Einzeiler finde ich übrigens klasse!!!
Gut ihn anzupassen finde ich ebenso, allerdings habe ich bei solchen kurzen immer Angst, bei der nächsten Aufgabe an vielen Stellen nicht weiter zu kommen ... kann ich ja das Forum nutzen ๐Ÿ˜‚.
Im Ernst, der Einzeiler ist mir irgendwie sehr klar, wobei meine Probleme noch auf der Ebene sind, nicht zu wissen, welche Befehle ich benötige um was zu tun. (also aus && wird nun | )
Ein Beispiel:
Wenn ich einen Block abgearbeitet habe, wie ich dann die Ausgabe die Ausgabe "konserviere" bzw. in Variablen schreiben soll bzw. mit einer Variablen weiterarbeiten soll.
Da fehlen mir irgendwie Beispiele ... ๐Ÿ˜Ž

Hätte gerne auch eine Korinthe gek ... ๐Ÿ˜Š๐Ÿ˜Š๐Ÿ˜Š
Member: newline
newline Apr 22, 2021 at 10:36:04 (UTC)
Goto Top
Zitat von @Lochkartenstanzer:

Moin,

Die mit awk/gawk geht es recht einfach :

>  awk ' { print length " " $0 }  ' <eingabedatei
> 

z.B.

> nas-trovje:~/tmp> awk ' { print length ": " $0 }  ' <lorem-impsum.txt 
> 17: Lorem ipsum dolor
> 20: sit amet, consetetur
> 26: sadipscing elitr, sed diam
> 32: nonumy eirmod tempor invidunt ut
> 16: labore et dolore
> 24: magna aliquyam erat, sed
> 29: diam voluptua. At vero eos et
> 41: accusam et justo duo dolores et ea rebum.
> 42: Stet clita kasd gubergren, no sea takimata
> 67: sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
> 0: 
> 

lks

Wobei hier wieder die Boardmittel-Problematik aufploppt ...
Member: colinardo
colinardo Apr 22, 2021 updated at 10:49:48 (UTC)
Goto Top
Servus @newline,
Zitat von @newline:
Im Ernst, der Einzeiler ist mir irgendwie sehr klar, wobei meine Probleme noch auf der Ebene sind, nicht zu wissen, welche Befehle ich benötige um was zu tun. (also aus && wird nun | )
Nein das sind zwei paar Schuhe, das eine ist das Ausführen eines Folgebefehls wenn der vorangegangene ohne Fehler abgeschlossen wurde, das andere ist das Übergeben von Werten/Objekten über die sogenannte Powershell-"Pipeline" an folgende Befehle/CMDLets.
Ein Beispiel:
Wenn ich einen Block abgearbeitet habe, wie ich dann die Ausgabe die Ausgabe "konserviere" bzw. in Variablen schreiben soll bzw. mit einer Variablen weiterarbeiten soll.
Da fehlen mir irgendwie Beispiele ... ๐Ÿ˜Ž
Am besten du fängst bei 0 an, das ist auf lange Sicht gesehen nachhaltiger face-smile.

Da ziehe ich gerne immer meine Linkliste für den PS Anfänger aus dem Hut:

back-to-topPowershell Leitfaden für Anfänger

back-to-topPflichtlektüre
back-to-topErweiterte Grundlagen
back-to-topZusätzliche Ressourcen

Danach bist du angehender Profi.

Viel Erfolg!

Grüße Uwe
Member: Lochkartenstanzer
Lochkartenstanzer Apr 22, 2021 updated at 10:55:09 (UTC)
Goto Top
Zitat von @newline:

Wobei hier wieder die Boardmittel-Problematik aufploppt ...

Erstellst und bearbeitest Du HTML-Dateien mit Bordmitteln? Notepad?

Oder reparierst Du Dein Auto mit Bordwerkzeug?

lks

PS: Nichts gegen Notepad, ist ein wunderbares Werkzeug, aber nicht für alles geeignet.
Member: newline
newline Apr 22, 2021 at 12:04:37 (UTC)
Goto Top
Uwe, eine solche Liste habe ich gemeint - und gesucht - DANKESCHÖN!

@ Lochkartenstanzer: Du hast so recht! Meine Anmerkung bezog sich auch eher auf das Problem, wenn man anderen "das Programm" mitgeben möchte - vor allem solchen, die noch weniger Ahnung haben ๐Ÿคฃ
Btw: Mein Opa hat damals bei IBM ein Patent auf die schnellere Verarbeitung von Lochkarten registriert! Schön, solche Spuren auch heute noch zu finden ๐Ÿ˜Š manche können sich darunter nix mehr vorstellen ...