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?
Gruß newline
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 666002
Url: https://administrator.de/forum/zeichen-zaehlen-um-zeilenlaege-zu-begrenzen-666002.html
Ausgedruckt am: 13.03.2025 um 19:03 Uhr
14 Kommentare
Neuester Kommentar
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:
Gruß
Doskias
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
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.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!
Und vielleicht bis dahin auch noch ein wenig in Powershell eingearbeitet hast ? 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:
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
Und falls du dann mal mit Powershell etwas weiter bist hier noch ergänzend eine kurze Variante
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.
$max=1000
Select-String 'C:\temp\irgendwas.htm' -Pattern ".{$($max+1)}" | select -Expand LineNumber
Etwas zu Lesen darüber Quantifizierer in regulären Ausdrücken
Gruß w.
Du "brauchst" so gesehen in PS keine Codeblöcke. Beispiel
macht halt nur ein Update der Gruppenrichtlinie
Zeigt dir einfach das aktuelle Datum mit der aktuellen Uhrzeit an
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 ;)
gpupdate
macht halt nur ein Update der Gruppenrichtlinie
get-Date
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 ;)
Also dann mach es doch gleich als Einzeiler und Pack das Max auch nach unten 
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)
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)

Ja klar ... Korinthen kacken
.... Sollte für den TO dann doch noch "minimale" Hilfe darstellen
.
Der zeigt dann aber nur Zeilen die mind. 1000 Zeichen haben MAX + 1 wäre hier nötig wenn 1000 noch erlaubt sind 
Zurück Kortinthe gekackt
Gruß w.
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
War ja nur ne Ergänzung des Threads ...Zurück Kortinthe gekackt
Gruß w.
Moin,
Die mit awk/gawk geht es recht einfach :
z.B.
lks
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
Servus @newline,
.
Da ziehe ich gerne immer meine Linkliste für den PS Anfänger aus dem Hut:
Danach bist du angehender Profi.
Viel Erfolg!
Grüße Uwe
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.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 ... 😎
Am besten du fängst bei 0 an, das ist auf lange Sicht gesehen nachhaltiger 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 ... 😎
Da ziehe ich gerne immer meine Linkliste für den PS Anfänger aus dem Hut:
Powershell Leitfaden für Anfänger
Pflichtlektüre
- Kapitel 1: Erste Schritte mit PowerShell
- Kapitel 2: Das Hilfesystem
- Kapitel 3: Entdecken von Objekten, Eigenschaften und Methoden
- Kapitel 4: Einzeiler und die Pipeline
- Kapitel 5: Formatierung, Aliase, Anbieter, Vergleich
- Kapitel 6: Flusssteuerung
- Kapitel 7: Arbeiten mit WMI
- Kapitel 8: PowerShell-Remoting
- Kapitel 9: Funktionen
- Kapitel 10: Skriptmodule
- Anhang A: Hilfesyntax
Erweiterte Grundlagen
- Alles, was Sie schon immer über Arrays wissen wollten
- Alles, was Sie schon immer über Hashtabellen wissen wollten
- Was Sie schon immer über PSCustomObject wissen wollten
- Alles, was Sie schon immer über die Variablenersetzung in Zeichenfolgen wissen wollten
- Alles, was Sie schon immer über die IF-Anweisung wissen wollten
- Alles, was Sie schon immer über die switch-Anweisung wissen wollten
- Alles, was Sie schon immer über Ausnahmen wissen wollten
- Alles, was Sie schon immer über $null wissen wollten
- Alles, was Sie schon immer über ShouldProcess wissen wollten
- Verwenden von Erweiterung mit der TAB-TASTE
Zusätzliche Ressourcen
- PowerShell-Lernressourcen
- Module/CMDLet Reference
- API-Referenz für PowerShell SDK
- Reguläre Ausdrücke in .NET (Regular Expressions)
- https://docs.microsoft.com/en-us/powershell/
- http://www.msxfaq.de/code/powershell/powershell.htm
- PowerShell for Runaways - Part I
- PowerShell For Runaways - Part II
Danach bist du angehender Profi.
Viel Erfolg!
Grüße Uwe
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.