werner1966
Goto Top

Länge von Dateiname ermitteln

Hallo Leute,

ich suche ein Progi bzw. ein Script/Batch wie in Betreff beschrieben.
details:
Ich habe einige Dutzend Ordner inkl. Unterordner wo sehr vielen Dateien sind. Hier möchte gerne wissen, welche Dateien z.B. einen längeren Dateinamen (nur Präfix ist zu berücksichtigen)
haben als 15(dieser Wert sollte "vorher" vom anwender abgefragt werden, also variabel), einen dateinamen der GLEICH 15 (auch variabel) oder dateinamen, die zwischen 2 Werten (variabel)liegen.....
Diese "Kandidaten" sollten am besten in einer Text (besser Excel)-datei aufgeführt werden. INfos hier: Pfad zur datei, Dateiname, Anzahl Zeichen, wieviel Dateien haben 15 Zeichen(leerzeichen sollen auch addiert werden) insgesamt.

Also im Grunde ein Tool, welches mir möglichst viel Infos zum Thema "Länge Dateiname (nur Präfix)" in Ordner/Rekursiv in einer Datei wieder gibt!

Für einen Tipp wäre ich sehr dankbar!

Gruß
Werner1966

Content-Key: 112277

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

Printed on: April 19, 2024 at 00:04 o'clock

Mitglied: 60730
60730 Mar 24, 2009 at 23:01:49 (UTC)
Goto Top
Servus,

so aus dem Bauch heraus:
dir /s "laufwerk:\Ordner\??????????????*.???" >laufwerk\Ordner\log.txt  

Progi=verhohnepiepung von Programm?

Gruß
Member: bastla
bastla Mar 24, 2009 at 23:47:59 (UTC)
Goto Top
Hallo Werner1966 und willkommen im Forum!

Für's Erste nur ein Vorschlag, um Pfad und Dateiname für Dateien mit mehr als 15 Zeichen in eine Datei zu schreiben:
@echo off & setlocal
set "Ordner=D:\Test"  
set "Log=D:\LangeNamen.txt"  
set L=15

if exist "%Log%" del "%Log%"  
for /f "delims=" %%i in ('dir /s /b /a-d "%Ordner%\*.*"') do call :ProcessFile "%%i"  
goto :eof

:ProcessFile
set "Name=%~n1"  
call set "Z=%%Name:~%L%%%"  
if defined Z >>"%Log%" echo %~1;%~n1  
goto :eof
Wenn Du die entstehende Datei in Excel importierst, kannst Du mit der Funktion LÄNGE() die Zeichenanzahl des Namens ermitteln und mit ZÄHLENWENN() aus den Ergebnissen herausfiltern, wieviele Dateien es mit einer bestimmten Namenslänge gibt.

Falls Du nicht bereits vorher selektieren, sondern die Informationen für alle Dateien festhalten willst, genügt folgende Zeile 7 (ohne die übrigen Zeilen danach):
for /f "delims=" %%i in ('dir /s /b /a-d "%Ordner%\*.*"') do >>"%Log%" echo %%i;%%~ni
Grüße
bastla
Member: Biber
Biber Mar 25, 2009 at 12:33:52 (UTC)
Goto Top
Moin Werner,

zum Üben von Skripterstellung ist das eine nette Aufgabe - werde ich mal in in meinem nächsten VHS-Kurs in Kleingruppen lösen lassen.

Um aber einen der erhofften Lerneffekte der TeilnehmerInnen schon mal vorwegzunehmen:
Unabhängig wieviele Wege/Sprachen/algorithmen/Strategien zum Ziel führen könnten,
alles gleichzeitig versuchen bedeutet meistens eben auch alles halbherzig versuchen.

Hier im vorliegenden konstruierten Problem windest Du Dich auch gedanklich zwischen
  • eben mal ein Skript starten und rekursiv rumrödeln lassen
  • komfortable und benutzerfreundliche geprüfte Eingabemöglichkeiten
  • allumfassende optisch aufbereitete Zusammenfassung als Tabelle mit Zwischensummen

---> nicht zielführend.
  • Entweder das Ziel ist eine Auswertung - die Du in der nächsten Budgetplanungsrunde so (per PowerPoint natürlich) an die Wand werfen kannst und alle Krawattenträger bringen standing ovations
--> dann mach es von Anfang an komplett in einer Excelmappe mit vielen Farben und einem halbseitigen Excelmakro.
  • oder aber das Ziel ist eine schnelle Ad-hoc-Auswertung ("will eben mal gucken, wieviele denn...?"). Dann kannst Du bei der Optik sowohl bei Eingabe wie Output sehr sehr viel Aufwand sparen und das mit einem Oneliner vom Cmdprompt aus machen. Meinetwegen auch mit einem 10- oder 20zeiligen Batch. Aber mehr Aufwand sollte nicht entstehen als eben diese Viertelstunde.

Ich würde also bastlas Ansatz insoweit in Richtung der zweiten Möglichkeit variieren, dass keine Folgeverarbeitung mit Excel o.ä. mehr nötig/vorgesehen ist.
Die minimalen (und hinreichenden) Änderungen führen dann hierzu:
:: -------snipp FileLen.cmd
@echo off & setlocal enableDelayedExpansion
if "%1"=="" %0 15 15  
if "%2"=="" %0 %1 17  

set "Ordner=D:\Temp"  
:: set "Log=D:\work:\LangeNamen.txt" 
Set "Log=con:"   
Set /a "Lmin=%1,Lmax=%2"  

if exist "%Log%" del "%Log%"  
For /L %%x in (%Lmin%,1, %Lmax%) do (
  Set /a "Sum=0"  
  for /f "delims=" %%i in ('dir /s /b /a-d "%Ordner%\*.txt"') do call :ProcessFile "%%i" %%x  
  echo Anzahl Namen mit %%x Zeichen: !sum!  
)  
goto :eof

:ProcessFile
set "Name=%~n1;"  
Set "Z=!name:~%2!"  
if defined Z if "!name:~%2,1!"==";" set /a "sum+=1" &&   >>"%Log%" echo %2;%~1;%~n1  

goto :eof
... und folgendem Output:
- nur exakte Länge 15:
>e:\schnipsel\FileLen
15;D:\Temp\DeCryptErgebnis.txt;DeCryptErgebnis
15;D:\Temp\input\jetzte001auszug.txt;jetzte001auszug
15;D:\Temp\Stp\STp925Schnipsel.txt;STp925Schnipsel
15;D:\Temp\xxx\DeCryptErgebnis.txt;DeCryptErgebnis
Anzahl Namen mit 15 Zeichen: 4
-- oder von/bis Länge 15 -17
>e:\schnipsel\FileLen 15 17
15;D:\Temp\DeCryptErgebnis.txt;DeCryptErgebnis
15;D:\Temp\input\jetzte001auszug.txt;jetzte001auszug
15;D:\Temp\Stp\STp925Schnipsel.txt;STp925Schnipsel
15;D:\Temp\xxx\DeCryptErgebnis.txt;DeCryptErgebnis
Anzahl Namen mit 15 Zeichen: 4
16;D:\Temp\nerovistaNospace.txt;nerovistaNospace
16;D:\Temp\eins\nerovistaNospace.txt;nerovistaNospace
16;D:\Temp\input\vbsskripte_files.txt;vbsskripte_files
Anzahl Namen mit 16 Zeichen: 3
17;D:\Temp\Q_Createtable_NEW.txt;Q_Createtable_NEW
Anzahl Namen mit 17 Zeichen: 1
habe bei mir auf "*.txt" statt "*.*" eingeschränkt!

Würde mir vollkommen reichen vom Komfort der Parametrisierungsmöglichkeiten her und auch vom Ergebnis.

Mit irgendwelchen Excelkanonen auf den kleinen Spatzen werfen (oder wie hieß dieses Sprichwort?) lohnt sich nicht.

Grüße
Biber
Member: werner1966
werner1966 Mar 27, 2009 at 23:01:59 (UTC)
Goto Top
Hallo Biber,
KLasse!
Vielen Dank für das Script.
Anmerkungen sind herrlich....
Wenn einer Deiner VHS Kandidaten mal so ein "rundumsorglosdateinamenzaehlkomforttool" basteln könnte-> wäre ich sehr interessiert face-smile

Werde jetzt erstmal bei Zeiten selbst basteln...vielleicht darf ich, wenn ich nicht weiter komme, noch ein paar fragen stellen?

@danke auch an timobeil und bastla

Gruß
werner