Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

DOS Befehle - Kommandozeile - Zeichen von einem Pfad zählen - Tree

Frage Entwicklung Batch & Shell

Mitglied: Schimpy

Schimpy (Level 1) - Jetzt verbinden

26.03.2007, aktualisiert 27.03.2007, 17080 Aufrufe, 11 Kommentare

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
Mitglied: Biber
26.03.2007 um 11:18 Uhr
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?
01.
... 
02.
[21] D:\temp\test\test\1.2 
03.
[28] D:\temp\test\test\1.1\ebene1 
04.
[32] D:\temp\test\test\1.1\ErsteEbene 
05.
[40] D:\temp\test\test\1.1\ebene1\unterEbene2 
06.
[40] D:\temp\test\test\1.1\ebene1\unterEbene3 
07.
[51] D:\temp\test\test\1.1\ebene1\unterEbene2\Nochtiefer 
08.
[54] D:\temp\test\test\1.1\ebene1\unterEbene3\AuchWeitUnten 
09.
[41] D:\temp\test\test\1.1\ErsteEbene\darunter 
10.
[51] D:\temp\test\test\1.1\ErsteEbene\darunter\WeitUnten 
11.
[28] D:\temp\test\test\1.2\level1 
12.
[37] D:\temp\test\test\1.2\level1\Sublevel 
13.
[49] D:\temp\test\test\1.2\level1\Sublevel\Subsublevel
Bitte warten ..
Mitglied: Schimpy
26.03.2007 um 12:38 Uhr
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
Bitte warten ..
Mitglied: Biber
26.03.2007 um 12:58 Uhr
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:
01.
(=12:44:04  D:\temp=) 
02.
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.
01.
::--MiniGetLongPath.bat 
02.
@for /f "delims=" %%i in ('dir /ad /s /b %2') do @( 
03.
      echo %%~pnxi>%temp%\sz)  && for %%j in (%temp%\sz) do @if [%%~zj] GTR [%1] echo [%%~zj] %%~i 
04.
05.
del %temp%\sz >nul 2>nul 
06.
::-----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]
Bitte warten ..
Mitglied: paulepank
26.03.2007 um 12:58 Uhr
Hallo Schimpy

um die Beispielausgabe von Biber zu erreichen kann man das so in eine Batch schreiben:

01.
@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:

01.
@echo off && dir /b /ad /s c:  | gawk "{printf (\"[%%3.0f] %%s\n\",length(),$0)}"
Grüße paulepank
Bitte warten ..
Mitglied: paulepank
26.03.2007 um 13:52 Uhr
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
Bitte warten ..
Mitglied: Biber
26.03.2007 um 14:06 Uhr
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
Bitte warten ..
Mitglied: paulepank
26.03.2007 um 14:58 Uhr
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
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-version
01.
@echo off && dir /b /a /s c:\  | gawk "{if (length()>258) printf (\"[%%3.0f] %%s\n\",length()-3,substr($0,4))}"


Gruß paulepank
Bitte warten ..
Mitglied: Biber
26.03.2007 um 15:20 Uhr
Moin pinkepank,

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.

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
Bitte warten ..
Mitglied: Schimpy
26.03.2007 um 16:13 Uhr
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

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...
Bitte warten ..
Mitglied: Biber
26.03.2007 um 17:29 Uhr
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:
01.
::--MidiGetLongPath.bat [Parameter1: Ab-Länge] [[optParameter2: Lw:\Pfad[[\name.ext]]]] 
02.
@echo off & setlocal & set /a Maxlen=%1 
03.
@for /f "delims=" %%i in ('dir /s /b %~2') do @( 
04.
      echo %%~pnxi>%temp%\sz) && for %%j in (%temp%\sz) do @call :EchoIfGTR %%~zj "%%~i" 
05.
06.
@del %temp%\sz >nul 2>nul & goto :eof 
07.
:EchoIfGtr parameter1:LängeIST parameter2 Pfad/Dateiname in Anfü-Zeichen 
08.
Set /a thislen=%1  
09.
If %thislen% GTR %maxlen% echo [%thislen%] %~2 
10.
::-----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:..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]
Bitte warten ..
Mitglied: Schimpy
27.03.2007 um 13:57 Uhr
wunderbar!

Vielen Dank

hat geklappt
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
gelöst Dos-Box, seltsame(s) Zeichen - Was und woher? (6)

Frage von Franz-Josef-II zum Thema Batch & Shell ...

Batch & Shell
gelöst In Batch variable DOS-Funktion von "größer" und "kleiner" Zeichen unterdrücken (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...