DOS Befehle - Kommandozeile - Zeichen von einem Pfad zählen - Tree
DOS Befehle - Kommandozeile - Zeichen von einem Pfad zählen - Tree
Ich suche einen Befehl auf Ebene - Kommandozeile
der mir die Zeichen eines Pfades zählt
Kommando -Option C:\
gibt mir alle Pfade inkl. Zeichen aus
so ne Art "TREE" Befehl nur mit Anzahl der Zeichen
Ich suche einen Befehl auf Ebene - Kommandozeile
der mir die Zeichen eines Pfades zählt
Kommando -Option C:\
gibt mir alle Pfade inkl. Zeichen aus
so ne Art "TREE" Befehl nur mit Anzahl der Zeichen
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 55024
Url: https://administrator.de/contentid/55024
Ausgedruckt am: 26.11.2024 um 11:11 Uhr
11 Kommentare
Neuester Kommentar
Gibt es nicht.
Nicht unter DOS.
Nicht unter Netzwerke.
Eventuell in Batch & Shell.
Rückfragen: Wie soll das aussehen, wofür soll das gut sein?
Anzeige in dieser Art oder anders?
Nicht unter DOS.
Nicht unter Netzwerke.
Eventuell in Batch & Shell.
Rückfragen: Wie soll das aussehen, wofür soll das gut sein?
Anzeige in dieser Art oder anders?
...
[21] D:\temp\test\test\1.2
[28] D:\temp\test\test\1.1\ebene1
[32] D:\temp\test\test\1.1\ErsteEbene
[40] D:\temp\test\test\1.1\ebene1\unterEbene2
[40] D:\temp\test\test\1.1\ebene1\unterEbene3
[51] D:\temp\test\test\1.1\ebene1\unterEbene2\Nochtiefer
[54] D:\temp\test\test\1.1\ebene1\unterEbene3\AuchWeitUnten
[41] D:\temp\test\test\1.1\ErsteEbene\darunter
[51] D:\temp\test\test\1.1\ErsteEbene\darunter\WeitUnten
[28] D:\temp\test\test\1.2\level1
[37] D:\temp\test\test\1.2\level1\Sublevel
[49] D:\temp\test\test\1.2\level1\Sublevel\Subsublevel
Moin Schimpy,
für diesen Zweck habe ich mal ein kleines Batch-Tut "FindlongPath - bedenklich lange Pfade finden" hier ins Forum in den Bereich Batch & Shell gestellt.
Okay, ich bin da ein bissi ins Schwafeln gekommen, aber kannst es ja trotzdem mal überfliegen. Sollte laufen.
Falls ihr zeitiger essen wollt, könnte ich auch bei diesem Skript ein wenig die Luft aus dem Käse drücken und das zu einem Oneliner vom CMD-Prompt zusammendampfen,
der dann so aussieht:
Wenn Du den Copy & Paste'st und abfeuerst, dann bringt er dir alle Pfade mit einer Länge > 50 Zeichen unterhalb des aktuellen Pfads.
Als Batch mit dem Pflichtparameter 1 [Ab-Länge] und dem optionalen Parameter 2 [ Lw/Pfad] sähe so aus.
Aufruf dann z.B. mit "MiniGetLongPath.bat 230 \\UnserServer\Public >>UnserKritischerPfad.log"
Gruss Biber
[Edit] Ich habe gerade auch paulepanks Varianten gesehen.
Ich glaube, wir lassen den Thread mal nach Batch & Shell verschieben, hm?
Wäre doch schade, wenn solche Lösungsansätze hier unter "Netzwerke" verloren gehen...
[/Edit]
für diesen Zweck habe ich mal ein kleines Batch-Tut "FindlongPath - bedenklich lange Pfade finden" hier ins Forum in den Bereich Batch & Shell gestellt.
Okay, ich bin da ein bissi ins Schwafeln gekommen, aber kannst es ja trotzdem mal überfliegen. Sollte laufen.
Falls ihr zeitiger essen wollt, könnte ich auch bei diesem Skript ein wenig die Luft aus dem Käse drücken und das zu einem Oneliner vom CMD-Prompt zusammendampfen,
der dann so aussieht:
(=12:44:04 D:\temp=)
for /f "delims=" %i in ('dir /ad /s /b') do @(echo %~pnxi>sz) && for %j in (sz) do @if [%~zj] GTR [50] echo [%~zj] %~i
Als Batch mit dem Pflichtparameter 1 [Ab-Länge] und dem optionalen Parameter 2 [ Lw/Pfad] sähe so aus.
::--MiniGetLongPath.bat
@for /f "delims=" %%i in ('dir /ad /s /b %2') do @(
echo %%~pnxi>%temp%\sz) && for %%j in (%temp%\sz) do @if [%%~zj] GTR [%1] echo [%%~zj] %%~i
)
del %temp%\sz >nul 2>nul
::-----MiniGetLongPath.bat [ungetestete Skizze]
Gruss Biber
[Edit] Ich habe gerade auch paulepanks Varianten gesehen.
Ich glaube, wir lassen den Thread mal nach Batch & Shell verschieben, hm?
Wäre doch schade, wenn solche Lösungsansätze hier unter "Netzwerke" verloren gehen...
[/Edit]
Hallo Schimpy
um die Beispielausgabe von Biber zu erreichen kann man das so in eine Batch schreiben:
oder wenn du eine Windowsversion vom AWK/Gawk hast lautet die Batchzeile so:
Grüße paulepank
um die Beispielausgabe von Biber zu erreichen kann man das so in eine Batch schreiben:
@echo off && setlocal enableDelayedExpansion && for /f "delims=" %%i in ('dir /b /ad /s c:') do @echo %%i>tmp.txt && for %%j in (tmp.txt) do @set /a lange=%%~zj-3 && @echo [!lange!] %%i
oder wenn du eine Windowsversion vom AWK/Gawk hast lautet die Batchzeile so:
@echo off && dir /b /ad /s c: | gawk "{printf (\"[%%3.0f] %%s\n\",length(),$0)}"
Grüße paulepank
Hallo,
Es geht nicht wie du oben beschrieben hast um Pfadnamen sondern um Dateinamen.
Bei Dateinamen > 255 kann es nicht um Windows gehen
Unter welchem BS soll die Batch laufen ?
Grüße paulepank
Um den Nutzern zeigen zu können, dass sie die Dateinamen von diesen Dateien > 255 ändern müssen.
Wäre es hilfreich zu wissen um welche Dateien es sich handelt.
Jetzt läßt du die Katze aus dem Sack.Wäre es hilfreich zu wissen um welche Dateien es sich handelt.
Es geht nicht wie du oben beschrieben hast um Pfadnamen sondern um Dateinamen.
Bei Dateinamen > 255 kann es nicht um Windows gehen
Unter welchem BS soll die Batch laufen ?
Grüße paulepank
Na ja, paulepank,
soooo schlimm isset ja nun auch nicht...
Dann müsste jeweils in Deinen und meinem Oneliner der DIR-Parameter /ad geändert werden in /a-d. Und statt "Startpfad" eingegeben werden "Startpfad\Datei-Wildcards" .
Das ist eine Anpassung, die man/frau für registrierte Kunden doch fast noch für lau machen könnte...
Aber ich hatte mich auch schon gewundert, dass zuerst von Pfaden und TREE u.ä, die rede war, aber nicht von Dateinamen...
Gruss
Biber
soooo schlimm isset ja nun auch nicht...
Dann müsste jeweils in Deinen und meinem Oneliner der DIR-Parameter /ad geändert werden in /a-d. Und statt "Startpfad" eingegeben werden "Startpfad\Datei-Wildcards" .
Das ist eine Anpassung, die man/frau für registrierte Kunden doch fast noch für lau machen könnte...
Aber ich hatte mich auch schon gewundert, dass zuerst von Pfaden und TREE u.ä, die rede war, aber nicht von Dateinamen...
Gruss
Biber
Na ja, paulepank,
soooo schlimm isset ja nun auch nicht...
das ist richtig, ich wundere mich nur wenn man so was "umfassendes" vorhat ,das man ein Problem nicht richtig beschreiben kann.soooo schlimm isset ja nun auch nicht...
Dann müsste jeweils in Deinen und meinem Oneliner der DIR-Parameter /ad
geändert werden in /a-d. Und statt "Startpfad" eingegeben werden
"Startpfad\Datei-Wildcards" .
geändert werden in /a-d. Und statt "Startpfad" eingegeben werden
"Startpfad\Datei-Wildcards" .
auch nicht ganz richtig. Option /a erfasst auch leere Verzeichnisse, die zu lang sind
außerdem müssen die Zeichen "c:\" vom Ergebnis abgezogen werden, da sie nicht
zu der beschränkten Länge unter Windows gehören.
Das ist eine Anpassung, die man/frau
für registrierte Kunden doch fast noch
für lau machen könnte...
Klar, hier die neue AWK-versionfür registrierte Kunden doch fast noch
für lau machen könnte...
@echo off && dir /b /a /s c:\ | gawk "{if (length()>258) printf (\"[%%3.0f] %%s\n\",length()-3,substr($0,4))}"
Gruß paulepank
Moin pinkepank,
Na gut, das wiederum ist zwar wahr und richtig, aber relativ gesehen belanglos..
Was die "beschränkte Länge unter Window" betrifft: wenn die nun tatsächlich genau 255 wäre für alle M$-DLLs und Programme, lesende und schreibende.... dann vielleicht.
Aber in der real existierenden M$-Welt wird es ja ab 240 Zeichen Länge riskant, ab 249 Zeichen grob fahrlässig.
Und, nicht zu vergessen, wenn Umlaute und Unicode/Sonderzeichen dabei sind, dann zählen die jeweils mehrere Zeichen.
Die Younster, die vielleicht ihre Nicknames und Ordnernamen mit Euro-Zeichen € schreiben, dürfen eher an diese Grenze stossen.
Einzig gute Nachricht: Für Bill Gates war das $-Symbol noch zu keinem Zeitpunkt ein ungebräuchliches Symbol.
Das ist also Standard und zählt ein Zeichen...
Gruss
Biber
auch nicht ganz richtig. Option /a erfasst auch leere Verzeichnisse, die zu lang sind
außerdem müssen die Zeichen "c:\" vom Ergebnis abgezogen werden, da sie nicht
zu der beschränkten Länge unter Windows gehören.
außerdem müssen die Zeichen "c:\" vom Ergebnis abgezogen werden, da sie nicht
zu der beschränkten Länge unter Windows gehören.
Na gut, das wiederum ist zwar wahr und richtig, aber relativ gesehen belanglos..
Was die "beschränkte Länge unter Window" betrifft: wenn die nun tatsächlich genau 255 wäre für alle M$-DLLs und Programme, lesende und schreibende.... dann vielleicht.
Aber in der real existierenden M$-Welt wird es ja ab 240 Zeichen Länge riskant, ab 249 Zeichen grob fahrlässig.
Und, nicht zu vergessen, wenn Umlaute und Unicode/Sonderzeichen dabei sind, dann zählen die jeweils mehrere Zeichen.
Die Younster, die vielleicht ihre Nicknames und Ordnernamen mit Euro-Zeichen € schreiben, dürfen eher an diese Grenze stossen.
Einzig gute Nachricht: Für Bill Gates war das $-Symbol noch zu keinem Zeitpunkt ein ungebräuchliches Symbol.
Das ist also Standard und zählt ein Zeichen...
Gruss
Biber
So, Schimpy,
mal sehen, ob wir etwas Licht ins Dunkel bringen können.
Die kleine Randdiskussion eben bezog sich darauf, ob die (reine) Pfadlänge das Kriterium sein soll ODER die Pfadlänge plus Dateiname plus Extension.
Im ersten Anlauf haben paulepank und ich beide den DIR-Parameter "/ad" verwendet.
Der bedeutet übersetzt aber "berücksichtige nur Verzeichnisse, keine Dateien."
[Wenn jetzt eine/r dazwischenquakt, dass Verzeichnisse aber eigentlich auch Dateien sind, dann bitte per PN an mich ]
Hätten wir aber, wie als Antwort von mir postuliert, diese Bedingung umgedreht zu "DIR /a-d" , also alles AUSSER Verzeichnissen,
wäre uns ein leeres Verzeichnis auch durch die virtuellen Lappen gegangen, wenn es 1999 Zeichen im Namen hätte.
Da hatte paulepank schon vollkommen recht, aber ich habe lieber erstmal versucht mich rauszureden bevor ich das zugebe.
Leichter fällt es mir den anderen Denkfehler zuzugeben, wegen dem die "mehr als 200 Zeichen" nicht funktionieren.
Das liegt daran, dass ich in dem Einzeiler "nur" einen textuellen Vergleich mache zwischen z.B.
---> If [79] GTR [220] bla ............--->als Text ist "7" größer als "2", von daher....
---> ...wird alles angezeigt, was nun grad nicht eine Länge hat, bei der eine "1" vorne steht.
Also machen wir doch aus dem MiniGetLongpath.bat einen MidiGetLongpath.bat und spendieren noch zwei Zeilen:
So klappt es auch auf Dateinamen bezogen UND mit dem Längenparameter.
Gruss
Biber
[Edit] Anmerkung: wie paulepank oben richtig bemerkt hat, gehört eigentlich der Laufwerksbuchstabe und der Doppelpunkt (c:..z nicht mit zur Pfadangabe.
Die bei mir anzeigte Länge beschreibt aber die Länge von Pfad inclusive Laufwerk.
Pingelige sollten also das "Set /a thislen=%1" ersetzen durch "Set /a thislen=%1 -2" .
Zweite Anmerkung - diese Lösung ist naturgemäß nicht soooo furchtbar schnell.
Und da nicht ausdrücklich verbotzen ist, mit diesem Schnipsel auch alle Dateien eines 2488-TeraByte-Fileservers zu überprüfen, könnte es einen Moment länger dauern.
In diesem Fall sollte man/frau dann tatsächlich auf eine höhere Programmiersprache und ein rekursives Abarbeiten der Ordner zurückgreifen.
Und ein wenig optimieren - zum Beispiel ist es natürlich überflüssig, alle Dateien eines Ordners zu prüfen,
wenn schon der Ordnername selbst oder gar der Parent-Ordner zu lang war...
[/Edit]
mal sehen, ob wir etwas Licht ins Dunkel bringen können.
Die kleine Randdiskussion eben bezog sich darauf, ob die (reine) Pfadlänge das Kriterium sein soll ODER die Pfadlänge plus Dateiname plus Extension.
Im ersten Anlauf haben paulepank und ich beide den DIR-Parameter "/ad" verwendet.
Der bedeutet übersetzt aber "berücksichtige nur Verzeichnisse, keine Dateien."
[Wenn jetzt eine/r dazwischenquakt, dass Verzeichnisse aber eigentlich auch Dateien sind, dann bitte per PN an mich ]
Hätten wir aber, wie als Antwort von mir postuliert, diese Bedingung umgedreht zu "DIR /a-d" , also alles AUSSER Verzeichnissen,
wäre uns ein leeres Verzeichnis auch durch die virtuellen Lappen gegangen, wenn es 1999 Zeichen im Namen hätte.
Da hatte paulepank schon vollkommen recht, aber ich habe lieber erstmal versucht mich rauszureden bevor ich das zugebe.
Leichter fällt es mir den anderen Denkfehler zuzugeben, wegen dem die "mehr als 200 Zeichen" nicht funktionieren.
Das liegt daran, dass ich in dem Einzeiler "nur" einen textuellen Vergleich mache zwischen z.B.
---> If [79] GTR [220] bla ............--->als Text ist "7" größer als "2", von daher....
---> ...wird alles angezeigt, was nun grad nicht eine Länge hat, bei der eine "1" vorne steht.
Also machen wir doch aus dem MiniGetLongpath.bat einen MidiGetLongpath.bat und spendieren noch zwei Zeilen:
::--MidiGetLongPath.bat [Parameter1: Ab-Länge] [[optParameter2: Lw:\Pfad[[\name.ext]]]]
@echo off & setlocal & set /a Maxlen=%1
@for /f "delims=" %%i in ('dir /s /b %~2') do @(
echo %%~pnxi>%temp%\sz) && for %%j in (%temp%\sz) do @call :EchoIfGTR %%~zj "%%~i"
)
@del %temp%\sz >nul 2>nul & goto :eof
:EchoIfGtr parameter1:LängeIST parameter2 Pfad/Dateiname in Anfü-Zeichen
Set /a thislen=%1
If %thislen% GTR %maxlen% echo [%thislen%] %~2
::-----MidiGetLongPath.bat [getestete Skizze]
Gruss
Biber
[Edit] Anmerkung: wie paulepank oben richtig bemerkt hat, gehört eigentlich der Laufwerksbuchstabe und der Doppelpunkt (c:..z nicht mit zur Pfadangabe.
Die bei mir anzeigte Länge beschreibt aber die Länge von Pfad inclusive Laufwerk.
Pingelige sollten also das "Set /a thislen=%1" ersetzen durch "Set /a thislen=%1 -2" .
Zweite Anmerkung - diese Lösung ist naturgemäß nicht soooo furchtbar schnell.
Und da nicht ausdrücklich verbotzen ist, mit diesem Schnipsel auch alle Dateien eines 2488-TeraByte-Fileservers zu überprüfen, könnte es einen Moment länger dauern.
In diesem Fall sollte man/frau dann tatsächlich auf eine höhere Programmiersprache und ein rekursives Abarbeiten der Ordner zurückgreifen.
Und ein wenig optimieren - zum Beispiel ist es natürlich überflüssig, alle Dateien eines Ordners zu prüfen,
wenn schon der Ordnername selbst oder gar der Parent-Ordner zu lang war...
[/Edit]