schimpy
Goto Top

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

Content-ID: 55024

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

Ausgedruckt am: 26.11.2024 um 11:11 Uhr

Biber
Biber 26.03.2007 um 11:18:12 Uhr
Goto Top
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?
...
[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
Schimpy
Schimpy 26.03.2007 um 12:38:42 Uhr
Goto Top
Hallo Biber,

wir migrieren grade Rechner / Files in eine neue Domäne.

Dazu nutzen wir u.a. das Tool "CACLS" dieses bricht aber ab einer Zeichenlänge von 255 Zeichen ab und macht auch nicht weiter.

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.

Deine dargestellte Anzeige wäre schon mehr als perfekt.

wie kann ich das umsetzen?

hast du da schon ein Script was du mir zur Verfügung stellen könntest?

Vielen Dank

mfG
Biber
Biber 26.03.2007 um 12:58:47 Uhr
Goto Top
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:
(=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  
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.
::--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]
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]
paulepank
paulepank 26.03.2007 um 12:58:57 Uhr
Goto Top
Hallo Schimpy

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
paulepank
paulepank 26.03.2007 um 13:52:34 Uhr
Goto Top
Hallo,
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.
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
Biber
Biber 26.03.2007 um 14:06:06 Uhr
Goto Top
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... face-wink

Aber ich hatte mich auch schon gewundert, dass zuerst von Pfaden und TREE u.ä, die rede war, aber nicht von Dateinamen...

Gruss
Biber
paulepank
paulepank 26.03.2007 um 14:58:20 Uhr
Goto Top
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.

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" .

auch nicht ganz richtig. Option /a erfasst auch leere Verzeichnisse, die zu lang sind face-smile
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... face-wink

Klar, hier die neue AWK-version
@echo off && dir /b /a /s c:\  | gawk "{if (length()>258) printf (\"[%%3.0f] %%s\n\",length()-3,substr($0,4))}"  


Gruß paulepank
Biber
Biber 26.03.2007 um 15:20:06 Uhr
Goto Top
Moin pinkepank,

auch nicht ganz richtig. Option /a erfasst auch leere Verzeichnisse, die zu lang sind face-smile
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.. face-wink

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
Schimpy
Schimpy 26.03.2007 um 16:13:24 Uhr
Goto Top
moin Biber, moin paulepank

sorry, wenn ich mich unklar ausgedrückt habe, aber soooo gut kenn ich mich mit Skripten leider nicht aus ;)

Mein Anliegen:

Ich möchte in alle Ordner / Unterordner + Dateien einen bestimmten Benutzer mit bestimmten Rechten hinzufügen, dies löse ich über CACLS, da CACLS aber abbricht sobald der komplette Verzeichnis/Dateipfad > 255 Zeichen ist, brauchte ich ein Skript was mir die Anzahl der Zeichen ( also Pfad + Dateiname + Endung ) zählt. So kann ich dem Nutzer sagen "hallo, hier hängts, änder die Dateien oder die sind futsch" ;)

ich hab jetzt einfach Bibers Variante genommen, die klappt schonma perfekt.

den Unterschied, vorallem euren letzten beiden Beiträge hab ich nicht ganz verstanden, vielleicht könnt ihr mir das ja nochmal etwas genauer erklären ( bzgl Wildcards? )

Aufjedenfall Vielen Dank für die schnelle Hilfe face-smile

Gruß
Schimpy

P.S.: Das mit der "Ab-Länge" funktioniert nicht richtig...

"MiniGetLongPath.bat 230 \\UnserServer\Public >>UnserKritischerPfad.log"

die 230 stellt doch die Zahl da, ab der er erst auflisten soll, oder nicht?

ich würde gerne nur die über 200 in die Textdatei bringen...
Biber
Biber 26.03.2007 um 17:29:33 Uhr
Goto Top
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 face-wink ]

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]
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:..zface-smile 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]
Schimpy
Schimpy 27.03.2007 um 13:57:53 Uhr
Goto Top
wunderbar!

Vielen Dank

hat geklappt face-smile