araziel
Goto Top

Verzeichniss auslesen und Namen untersuchen

Hi,
ich versuche gerade ein Skript zu schreiben das mir ein Verzeichniss auslesen soll und die Daten nach einer bestimmten Namenskonvention untersucht.

Die ersten Teile der Namenskonvention habe ich soweit gelöst.

Die Namenskonvention:
- Dateiname+Verzeichniss muss kleiner als 210 Zeichen sein.
soweit erledigt dank eines Beitrages von Biber.
- Es Dürfen nur Folgende Zeichen verwendet werden [A-Za-z0-9] und das minus
da habe ich Probleme ich habe es bis jetzt mit einer negativ Abfrage gemacht, also Alle Zeilen, die Leerzeichen usw. enthalten in eine Log-Datei geschrieben.
Aber dies ist mir zu unübersichtlich.

Leider bin ich bei regex nicht so Fit das ich wüsste wie man es beschreiben kann, meine Erste Idee war [^A-Za-z0-9-] aber da gibt findstr nicht das erwartete Ergebniss aus.

Wie kann ich die Abfrage gestalten das ich die Dateinamen mit Pfadangabe auf diese Konvention hin untersuchen kann.

Gruß
Sascha

Content-ID: 147238

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

Ausgedruckt am: 25.11.2024 um 07:11 Uhr

60730
60730 20.07.2010 um 13:27:53 Uhr
Goto Top
moin,

schreib doch einfach, dass - was du hast hier zwischen <code> </code> Blöcke....

Macht es irgendwie für uns "leichter" und folgende - die irgendwann mal hier aufschlagen "interessanter".

Gruß
77559
77559 20.07.2010 um 13:46:04 Uhr
Goto Top
Zitat von @Araziel:
Leider bin ich bei regex nicht so Fit das ich wüsste wie man es beschreiben kann, meine Erste Idee war [^A-Za-z0-9-] aber da
gibt findstr nicht das erwartete Ergebniss aus.
Die RegEx-Fähigkeiten vonFindstr sind eher rudimentär.
Du kannst auf vbscript ausweichen oder einen Win32-Port von Gnu Grep nehmen
dir /B |grep "[^A-Za-z0-9.-]"
funktioniert hier (für den ganzen Dateinamen mit Pfad musst du auch noch Doppelpunkt, Punkt und das Backslash zulassen)

Wie kann ich die Abfrage gestalten das ich die Dateinamen mit Pfadangabe auf diese Konvention hin untersuchen kann.
Ohne deinen vorhandenen Code zu sehen ist es schwer dir zu helfen wie Timo schon festgestellt hat.

Gruß
LotPings
Araziel
Araziel 20.07.2010 um 14:12:54 Uhr
Goto Top
Das ist das Skript das ich aus Bibers Tutorial Skript abgewandelt habe.

@ECHO off & SETLOCAL ENABLEEXTENSIONS 
SET usedvars=tmpdatei reportdatei p1 p1masked p2 x YN PAUSE_D ECHO_D  
if Defined DebugMyBatches ((set ECHO_D=@ECHO) & (set PAUSE_D=pause) ) else ( set ECHO_D=REM) 
CALL :paramcheck %1 %2 
IF exist "%tmpdatei%" del "%tmpdatei%"  
IF exist "%errortmp%" del "%errortmp%"  
IF exist "%reportdatei%" del "%reportdatei%"    
DIR %p1% /D /b /s >%tmpdatei% 2>>%errortmp%
SET /a p2=%p2%-1 
SETLOCAL EnableDelayedExpansion

rem Hier liegt das Problem, die Lösung Funktioniert aber ich finde sie sehr unschön,
rem da ich meine das man dies auch mit einer einzelnen Zeile Lösen können müsste.
rem und ich bekomme so nicht alle Sonderzeichen gefiltert, vorallem auch nicht andere Zeichensätze.

echo Leerzeichen >> %reportdatei%
echo " " >> %reportdatei%  
echo " " >> %reportdatei%  
find " " %tmpdatei% >> %reportdatei%  
echo " " >> %reportdatei%  
echo " " >> %reportdatei%  
echo Sonderzeichen >> %reportdatei%
echo " " >> %reportdatei%  
echo " " >> %reportdatei%  
findstr [_#,\(\)\*+/] %tmpdatei% >> %reportdatei%
echo " " >> %reportdatei%  
echo " " >> %reportdatei%  
echo Umlaute >> %reportdatei%
echo " " >> %reportdatei%  
echo " " >> %reportdatei%  
findstr [„Ž”™šá] %tmpdatei% >> %reportdatei%
echo " " >> %reportdatei%  
echo " " >> %reportdatei%  
echo Dateiname mit Pfad zu lang >> %reportdatei%
echo " " >> %reportdatei%  
echo " " >> %reportdatei%  
FOR /F "delims=" %%i in (%errortmp%) do (set "x=%%i") && %%i >>%reportdatei%   
FOR /F "delims=" %%i in (%tmpdatei%) do (set "x=%%i") && if "!x:~%p2%,10!" GTR "@" @echo %%i >>%reportdatei%   




IF EXIST "%reportdatei%" (   
     ECHO Report wurde gespeichert als %reportdatei%.    
     ECHO - Reportdatei vom %date% -- Alle Verzeichnisse ^>%p2% auf %p1% -->>"%reportdatei%"    
     ECHO - Reportdatei "%reportdatei%" -->>"%reportdatei%"   
     SET /p YN="Auf %p1% wurden Pfade mit L„nge gr”áer %p2% gefunden. Anzeigen (J/N?) "   
     IF /i "!YN!"=="J" TYPE "%reportdatei%" |MORE  
) ELSE (
     ECHO Keine Pfade l„nger als %p2% Zeichen im Pfad %p1% gefunden. 
)
ENDLOCAL 
CALL :DebugShow_vars 
CALL :cleanup 
GOTO :eof

:ParamCheck 
IF (%1)==() (SET p1=%temp%) ELSE (SET p1=%1)
IF (%1)==() (SET p1=C:) ELSE (SET p1=%1) 
IF (%2)==() (SET /a p2=50 ) ELSE (SET /a p2=%2) 
SET p1masked=%p1::=$% 
SET p1masked=%p1masked:\=_% 
%ECHO_D% p1-^>p1masked ist %p1%-^>%p1masked%; p2 ist %p2% 
SET "tmpdatei=All.lst"  
SET "errortmp=error.lst"  
SET "Reportdatei=PfadeGTR%p2%.csv"  
CALL :Debugshow_vars "Nach Var-Setzen"  
goto :eof

:DebugShow_vars 
IF DEFINED DebugMyBatches ( 
SETLOCAL ENABLEDELAYEDEXPANSION 
FOR %%i IN (%usedvars%) DO (ECHO [%~1] Variable %%i="!%%i!" )    
ENDLOCAL 
PAUSE 
) 
GOTO :eof 

:cleanup 
%ECHO_D% in Subroutine :Cleanup 
IF EXIST "%tmpdatei%" (del "%tmpdatei%") & IF EXIST "%errortmp%" (del "%errortmp%") & %ECHO_D% Datei %tmpdatei% und %errortmp% wird gelöscht.   
FOR %%i IN (%usedvars% usedvars) DO @IF DEFINED %%i ( 
  (IF DEFINED DebugMyBatches echo %%i wird freigegeben) & (SET %%i=))
GOTO :eof 
rubberman
rubberman 20.07.2010 um 14:55:16 Uhr
Goto Top
Hallo Araziel,

habe deinen Code nur überflogen, sorry.
Du kannst eine Datei schreiben (blacklist.txt), die alle Verzeichnisnamen / Dateinamen enthält die deine geforderten Zeichen (einschließlich . ) nicht enthält.
Gegen diese Liste kannst du dann erneut prüfen.
...snipp
del "blacklist.txt" 2>nul  
for /f "delims=" %%a in ('dir /b^|findstr "[^A-Za-z0-9-\.]"') do >>"blacklist.txt" echo %%a  
for /f "delims=" %%a in ('dir /b^|findstr /v /g:"blacklist.txt"') do (  
  echo %%a
)
del "blacklist.txt"  
...snipp

Grüße
rubberman
Araziel
Araziel 26.07.2010 um 13:54:12 Uhr
Goto Top
So habe eine Lösung gebastellt.
Nicht schön aber selten.

Es wird noch erweitert da ich gerne noch einbauen möchte das der User das Laufwerk angeben kann und den Log. Dateinamen.
Aber ich wollte das Ergebniss der Bemühungen hier schon mal einstellen, falls noch andere ein solches Problem haben.

Das Skrikt Scannt nun ein Laufwerk nach den Kriterien:

Pfad+Datei nicht länger als 210 Zeichen
Namen= A-Z;a-z;0-9,-

Alle Falschen Dateien werden in einer Log Datei gespeichert.

Gruß
Sascha

rem Skript zur Pruefung, von Netzlaufwerken, auf die Namenskonventionen

rem Version 1.0b   - Auslesen der Dateistruktur und Pruefung der Dateien und Verzeichnisse auf nicht erlaubte Zeichen
rem Version 1.1b   - Pfadlaenge Pruefen
rem Version 1.2b   - geplant: Eingabemaske fuer dieverse Startoptionen
rem Version 1.4b   - geplant: Fortschrittsanzeige
rem Version 1.5b   - geplant: Skript Optimierung

rem ############################# START des Skriptes #############################

@echo off & SETLOCAL ENABLEEXTENSIONS 
title "Pruefung des Laufwerkes e: nach dem Filekonzeptes"  

rem ##############################################################################

set version=1.1b
set lastfalseverz=
set fVerz=
set fPart1=
set letzteaktion=keine
set dat_OK=true
set verz_OK=true
set /a len=210

del "getlen.tmp" 2>nul  
del "zeichen.tmp" 2>nul  
del "file_error.tmp" 2>nul  
del "find.tmp" 2>nul  
del "log.csv" 2>nul  

rem ##############################################################################
rem 
rem bereich fuer die aenderungen in der Version 1.2b
rem 
rem ##############################################################################

echo Dies ist die Log Datei für das Laufwerk e:. >> log.csv
echo ; >> log.csv
echo Bei Fragen ueber die Namenskonventionen wenden Sie sich bitte an Ihren zustaendigen XXXX >> log.csv
echo oder an die XXXX.
echo ; >> log.csv
echo Es werden alle Unterverzeichnisse angezeigt. Fehlerhafte Verzeichnisse werden Doppelt angezeigt mit dem >> log.csv
echo jeweiligen Fehler in der Spalte C. >> log.csv
echo Fehlerhafte Dateien werden Zeilenweise unter das jeweilige Verzeichniss in der Spalte B geschrieben. >> log.csv
echo Die jeweils dazugehörigen Fehler werden in der Spalte C dargestellt. >> log.csv
echo Korekte Dateien werden im Gegensatz zu Verzeichnissen nicht angezeigt. >> log.csv
echo ; >> log.csv
echo Die Namenskonvention der XXX besagt das Dateien nur Folgende Zeichen beinhalten dürfen: >>log.csv
echo A-Z >> log.csv
echo a-z >> log.csv
echo 0-9 >> log.csv
echo - >> log.csv
echo Zudem darf die gesamtlänge des Namens mit Pfadangabe in dieser XXXXX nicht ueber 210 Zeichen kommen. >> log.csv
echo Sie finden eine kurze beschreibung des jeweiligen Fehlers hinter der beanstandeten Datei. >> log.csv
echo ; >> log.csv
echo Die Liste der Dateien erhebt keinen Anspruch auf Vollstaendigkeit. >> log.csv
echo ; >> log.csv
echo Pfad;Dateiname;Fehler >> log.csv

for /f "delims=" %%a in ('dir /b /s /a:-d') do call :zerlegen "%%a"  
goto clean

rem ##############################################################################

:zerlegen
cls
echo #############################################################################
echo #Pruef-Skript zur Namenskonvention der XXX                                  #
echo #Version %version%                                                               #
echo #                                                                           #
echo #Derzeit wird das Laufwerk e: auf die Namenskonventionen der XXX geprueft   #
echo #                                                                           #
echo #Dieser Vorgang kann je nach Anzahl der Dateien auf dem Laufwerk mehere     #
echo #Minuten dauern.                                                            #
echo #                                                                           #
echo #Bitte brechen sie diesen Vorgang nicht ab, da keine Zwischenergebnisse     #
echo #zur Wiederaufnahme des Skriptes gespeichert werden.                        #
echo #                                                                           #
echo #Das Ergebniss dieser Suche finden sie in der Datei e:/log.csv.             #
echo #Diese Datei enthaelt zudem noch weitere Informationen ueber die            #
echo #Namenskonvention der XXX                                                  #
echo #                                                                           #
echo #############################################################################
echo Letzte Aktion:
echo %letzteaktion%

set sFullname=%1
for %%i in (%sFullname%) do set sVerz=%%~dpi
for %%i in (%sFullname%) do set spfad=%%~pi
for %%i in (%sFullname%) do set sFILE=%%~nxi
for %%i in (%sFullname%) do set sPart1=%%~ni
for %%i in (%sFullname%) do set sPart2=%%~xi

IF NOT "%sVerz%"=="%fVerz%" (  
  set verz_OK=true
  set fVerz=%sVerz%
  echo %sVerz% >> log.csv
  call :counter %sVerz% Verzeichniss
)
echo "%sPart1%">zeichen.tmp  
findstr ) zeichen.tmp > file_error.tmp
findstr /c:" " zeichen.tmp > file_error.tmp  
for %%i in ("file_error.tmp") do set /a "theLen=%%~zi"  
del "zeichen.tmp" 2>nul  
IF NOT %theLen%==0 GOTO file_error
IF NOT "%sPart1%"=="%fPart1%" (  
  set dat_OK=true
  set fPart1=%sPart1%
  call :counter %sPart1% Datei %sFILE%
)

set pruef_len=%sVerz%%sFILE%
echo %pruef_len% > getlen.tmp
echo %pruef_len%
for %%i in ("getlen.tmp") do set /a "theLen=%%~zi-3" & del getlen.tmp 2>nul  
set /a tolong=%theLen%-%len%
if %theLen% GTR %len% echo %pruef_len%;Um %tolong% Zeichen zu lang >> log.csv
goto eof

rem ##############################################################################

:file_error
For /F "tokens=* usebackq" %%a IN (file_error.tmp) DO set zeichen2=%%a & del find.tmp  
del "zeichen.tmp" 2>nul  
del "file_error.tmp" 2>nul  
echo ;%sFILE%;Namenskonvention nicht Eingehalten >> log.csv
set letzteaktion=Fehlerhaftes Datei %sFILE% in log.csv geschrieben
goto eof

rem ##############################################################################

:counter
echo %1%>getlen.tmp
for %%i in ("getlen.tmp") do set /a "theLen=%%~zi-4" & del getlen.tmp   
call :pruefen_1 %1 %2 %theLen% %3
goto eof

rem ##############################################################################

:pruefen_1
set pruefling=%1
set art=%2
set laenge=%3
if %art%==Datei (
  set /a laenge=%laenge%+2
  for /L %%i in (1,1,%laenge%) do call :pruefen_2 %1 %2 %3 %%i %4
)

if %art%==Verzeichniss (
  for /L %%i in (1,1,%laenge%) do call :pruefen_2 %1 %2 %3 %%i
)
goto eof

rem ##############################################################################

:pruefen_2
if %2==Datei (
  if %dat_OK%==false goto eof
)
if %2==Verzeichniss (
  if %verz_OK%==false goto eof
)
set zeichen2=NULL
set pruefling=%1
set art=%2
set laenge=%3
set /a i=%4+1
set ext=%5
call set substring=%%pruefling:~%i%,1%%
For /F "tokens=* usebackq" %%a IN (`echo %substring%`) DO set zeichen=%%a  
echo %zeichen% > zeichen.tmp
findstr /i "[A-Z-0-9]" zeichen.tmp > find.tmp  
findstr \ zeichen.tmp >> find.tmp
For /F "tokens=* usebackq" %%a IN (find.tmp) DO set zeichen2=%%a & del find.tmp  
IF NOT %zeichen2%==%zeichen% goto :fehler
goto eof

rem ##############################################################################

:fehler
if %art%==Verzeichniss goto verzfehler
if %art%==Datei goto datfehler
goto eof

rem ##############################################################################

:verzfehler
set verz_OK=false
IF "%lastfalseverz%"=="%pruefling%" goto eof  
set lastfalseverz=%pruefling%
echo %pruefling%;;Namenskonvention nicht Eingehalten >> log.csv
set letzteaktion=Fehlerhaftes %art% %pruefling% in log.csv geschrieben
goto eof

rem ##############################################################################

:datfehler
set dat_OK=false
IF "%lastfalsedat%"=="%pruefling%" goto eof  
set lastfalsedat=%pruefling%
echo ;%ext%;Namenskonvention nicht Eingehalten >> log.csv
set letzteaktion=Fehlerhafte %art% %ext% in log.csv geschrieben
goto eof

rem ##############################################################################

:clean
del "getlen.tmp" 2>nul  
del "zeichen.tmp" 2>nul  
del "file_error.tmp" 2>nul  
del "find.tmp" 2>nul  
goto eof

rem ##############################################################################

:eof