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

Verzeichniss auslesen und Namen untersuchen

Frage Entwicklung Batch & Shell

Mitglied: Araziel

Araziel (Level 1) - Jetzt verbinden

20.07.2010 um 12:31 Uhr, 3359 Aufrufe, 5 Kommentare

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
Mitglied: 60730
20.07.2010 um 13:27 Uhr
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ß
Bitte warten ..
Mitglied: LotPings
20.07.2010 um 13:46 Uhr
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
Bitte warten ..
Mitglied: Araziel
20.07.2010 um 14:12 Uhr
Das ist das Skript das ich aus Bibers Tutorial Skript abgewandelt habe.

01.
@ECHO off & SETLOCAL ENABLEEXTENSIONS  
02.
SET usedvars=tmpdatei reportdatei p1 p1masked p2 x YN PAUSE_D ECHO_D   
03.
if Defined DebugMyBatches ((set ECHO_D=@ECHO) & (set PAUSE_D=pause) ) else ( set ECHO_D=REM)  
04.
CALL :paramcheck %1 %2  
05.
IF exist "%tmpdatei%" del "%tmpdatei%" 
06.
IF exist "%errortmp%" del "%errortmp%" 
07.
IF exist "%reportdatei%" del "%reportdatei%"   
08.
DIR %p1% /D /b /s >%tmpdatei% 2>>%errortmp% 
09.
SET /a p2=%p2%-1  
10.
SETLOCAL EnableDelayedExpansion 
11.
 
12.
rem Hier liegt das Problem, die Lösung Funktioniert aber ich finde sie sehr unschön, 
13.
rem da ich meine das man dies auch mit einer einzelnen Zeile Lösen können müsste. 
14.
rem und ich bekomme so nicht alle Sonderzeichen gefiltert, vorallem auch nicht andere Zeichensätze. 
15.
 
16.
echo Leerzeichen >> %reportdatei% 
17.
echo " " >> %reportdatei% 
18.
echo " " >> %reportdatei% 
19.
find " " %tmpdatei% >> %reportdatei% 
20.
echo " " >> %reportdatei% 
21.
echo " " >> %reportdatei% 
22.
echo Sonderzeichen >> %reportdatei% 
23.
echo " " >> %reportdatei% 
24.
echo " " >> %reportdatei% 
25.
findstr [_#,\(\)\*+/] %tmpdatei% >> %reportdatei% 
26.
echo " " >> %reportdatei% 
27.
echo " " >> %reportdatei% 
28.
echo Umlaute >> %reportdatei% 
29.
echo " " >> %reportdatei% 
30.
echo " " >> %reportdatei% 
31.
findstr [„Ž”™šá] %tmpdatei% >> %reportdatei% 
32.
echo " " >> %reportdatei% 
33.
echo " " >> %reportdatei% 
34.
echo Dateiname mit Pfad zu lang >> %reportdatei% 
35.
echo " " >> %reportdatei% 
36.
echo " " >> %reportdatei% 
37.
FOR /F "delims=" %%i in (%errortmp%) do (set "x=%%i") && %%i >>%reportdatei%  
38.
FOR /F "delims=" %%i in (%tmpdatei%) do (set "x=%%i") && if "!x:~%p2%,10!" GTR "@" @echo %%i >>%reportdatei%  
39.
 
40.
 
41.
 
42.
 
43.
IF EXIST "%reportdatei%" (  
44.
     ECHO Report wurde gespeichert als %reportdatei%.     
45.
     ECHO - Reportdatei vom %date% -- Alle Verzeichnisse ^>%p2% auf %p1% -->>"%reportdatei%"   
46.
     ECHO - Reportdatei "%reportdatei%" -->>"%reportdatei%"  
47.
     SET /p YN="Auf %p1% wurden Pfade mit L„nge gr”áer %p2% gefunden. Anzeigen (J/N?) "  
48.
     IF /i "!YN!"=="J" TYPE "%reportdatei%" |MORE 
49.
) ELSE ( 
50.
     ECHO Keine Pfade l„nger als %p2% Zeichen im Pfad %p1% gefunden.  
51.
52.
ENDLOCAL  
53.
CALL :DebugShow_vars  
54.
CALL :cleanup  
55.
GOTO :eof 
56.
 
57.
:ParamCheck  
58.
IF (%1)==() (SET p1=%temp%) ELSE (SET p1=%1) 
59.
IF (%1)==() (SET p1=C:) ELSE (SET p1=%1)  
60.
IF (%2)==() (SET /a p2=50 ) ELSE (SET /a p2=%2)  
61.
SET p1masked=%p1::=$%  
62.
SET p1masked=%p1masked:\=_%  
63.
%ECHO_D% p1-^>p1masked ist %p1%-^>%p1masked%; p2 ist %p2%  
64.
SET "tmpdatei=All.lst" 
65.
SET "errortmp=error.lst" 
66.
SET "Reportdatei=PfadeGTR%p2%.csv" 
67.
CALL :Debugshow_vars "Nach Var-Setzen" 
68.
goto :eof 
69.
 
70.
:DebugShow_vars  
71.
IF DEFINED DebugMyBatches (  
72.
SETLOCAL ENABLEDELAYEDEXPANSION  
73.
FOR %%i IN (%usedvars%) DO (ECHO [%~1] Variable %%i="!%%i!" )   
74.
ENDLOCAL  
75.
PAUSE  
76.
)  
77.
GOTO :eof  
78.
 
79.
:cleanup  
80.
%ECHO_D% in Subroutine :Cleanup  
81.
IF EXIST "%tmpdatei%" (del "%tmpdatei%") & IF EXIST "%errortmp%" (del "%errortmp%") & %ECHO_D% Datei %tmpdatei% und %errortmp% wird gelöscht.  
82.
FOR %%i IN (%usedvars% usedvars) DO @IF DEFINED %%i (  
83.
  (IF DEFINED DebugMyBatches echo %%i wird freigegeben) & (SET %%i=)) 
84.
GOTO :eof 
Bitte warten ..
Mitglied: rubberman
20.07.2010 um 14:55 Uhr
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
01.
del "blacklist.txt" 2>nul 
02.
for /f "delims=" %%a in ('dir /b^|findstr "[^A-Za-z0-9-\.]"') do >>"blacklist.txt" echo %%a 
03.
for /f "delims=" %%a in ('dir /b^|findstr /v /g:"blacklist.txt"') do ( 
04.
  echo %%a 
05.
06.
del "blacklist.txt"
...snipp

Grüße
rubberman
Bitte warten ..
Mitglied: Araziel
26.07.2010 um 13:54 Uhr
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

01.
rem Skript zur Pruefung, von Netzlaufwerken, auf die Namenskonventionen 
02.
 
03.
rem Version 1.0b   - Auslesen der Dateistruktur und Pruefung der Dateien und Verzeichnisse auf nicht erlaubte Zeichen 
04.
rem Version 1.1b   - Pfadlaenge Pruefen 
05.
rem Version 1.2b   - geplant: Eingabemaske fuer dieverse Startoptionen 
06.
rem Version 1.4b   - geplant: Fortschrittsanzeige 
07.
rem Version 1.5b   - geplant: Skript Optimierung 
08.
 
09.
rem ############################# START des Skriptes ############################# 
10.
 
11.
@echo off & SETLOCAL ENABLEEXTENSIONS  
12.
title "Pruefung des Laufwerkes e: nach dem Filekonzeptes" 
13.
 
14.
rem ############################################################################## 
15.
 
16.
set version=1.1b 
17.
set lastfalseverz= 
18.
set fVerz= 
19.
set fPart1= 
20.
set letzteaktion=keine 
21.
set dat_OK=true 
22.
set verz_OK=true 
23.
set /a len=210 
24.
 
25.
del "getlen.tmp" 2>nul 
26.
del "zeichen.tmp" 2>nul 
27.
del "file_error.tmp" 2>nul 
28.
del "find.tmp" 2>nul 
29.
del "log.csv" 2>nul 
30.
 
31.
rem ############################################################################## 
32.
rem  
33.
rem bereich fuer die aenderungen in der Version 1.2b 
34.
rem  
35.
rem ############################################################################## 
36.
 
37.
echo Dies ist die Log Datei für das Laufwerk e:. >> log.csv 
38.
echo ; >> log.csv 
39.
echo Bei Fragen ueber die Namenskonventionen wenden Sie sich bitte an Ihren zustaendigen XXXX >> log.csv 
40.
echo oder an die XXXX. 
41.
echo ; >> log.csv 
42.
echo Es werden alle Unterverzeichnisse angezeigt. Fehlerhafte Verzeichnisse werden Doppelt angezeigt mit dem >> log.csv 
43.
echo jeweiligen Fehler in der Spalte C. >> log.csv 
44.
echo Fehlerhafte Dateien werden Zeilenweise unter das jeweilige Verzeichniss in der Spalte B geschrieben. >> log.csv 
45.
echo Die jeweils dazugehörigen Fehler werden in der Spalte C dargestellt. >> log.csv 
46.
echo Korekte Dateien werden im Gegensatz zu Verzeichnissen nicht angezeigt. >> log.csv 
47.
echo ; >> log.csv 
48.
echo Die Namenskonvention der XXX besagt das Dateien nur Folgende Zeichen beinhalten dürfen: >>log.csv 
49.
echo A-Z >> log.csv 
50.
echo a-z >> log.csv 
51.
echo 0-9 >> log.csv 
52.
echo - >> log.csv 
53.
echo Zudem darf die gesamtlänge des Namens mit Pfadangabe in dieser XXXXX nicht ueber 210 Zeichen kommen. >> log.csv 
54.
echo Sie finden eine kurze beschreibung des jeweiligen Fehlers hinter der beanstandeten Datei. >> log.csv 
55.
echo ; >> log.csv 
56.
echo Die Liste der Dateien erhebt keinen Anspruch auf Vollstaendigkeit. >> log.csv 
57.
echo ; >> log.csv 
58.
echo Pfad;Dateiname;Fehler >> log.csv 
59.
 
60.
for /f "delims=" %%a in ('dir /b /s /a:-d') do call :zerlegen "%%a" 
61.
goto clean 
62.
 
63.
rem ############################################################################## 
64.
 
65.
:zerlegen 
66.
cls 
67.
echo ############################################################################# 
68.
echo #Pruef-Skript zur Namenskonvention der XXX                                  # 
69.
echo #Version %version%                                                               # 
70.
echo #                                                                           # 
71.
echo #Derzeit wird das Laufwerk e: auf die Namenskonventionen der XXX geprueft   # 
72.
echo #                                                                           # 
73.
echo #Dieser Vorgang kann je nach Anzahl der Dateien auf dem Laufwerk mehere     # 
74.
echo #Minuten dauern.                                                            # 
75.
echo #                                                                           # 
76.
echo #Bitte brechen sie diesen Vorgang nicht ab, da keine Zwischenergebnisse     # 
77.
echo #zur Wiederaufnahme des Skriptes gespeichert werden.                        # 
78.
echo #                                                                           # 
79.
echo #Das Ergebniss dieser Suche finden sie in der Datei e:/log.csv.             # 
80.
echo #Diese Datei enthaelt zudem noch weitere Informationen ueber die            # 
81.
echo #Namenskonvention der XXX                                                  # 
82.
echo #                                                                           # 
83.
echo ############################################################################# 
84.
echo Letzte Aktion: 
85.
echo %letzteaktion% 
86.
 
87.
set sFullname=%1 
88.
for %%i in (%sFullname%) do set sVerz=%%~dpi 
89.
for %%i in (%sFullname%) do set spfad=%%~pi 
90.
for %%i in (%sFullname%) do set sFILE=%%~nxi 
91.
for %%i in (%sFullname%) do set sPart1=%%~ni 
92.
for %%i in (%sFullname%) do set sPart2=%%~xi 
93.
 
94.
IF NOT "%sVerz%"=="%fVerz%" ( 
95.
  set verz_OK=true 
96.
  set fVerz=%sVerz% 
97.
  echo %sVerz% >> log.csv 
98.
  call :counter %sVerz% Verzeichniss 
99.
100.
echo "%sPart1%">zeichen.tmp 
101.
findstr ) zeichen.tmp > file_error.tmp 
102.
findstr /c:" " zeichen.tmp > file_error.tmp 
103.
for %%i in ("file_error.tmp") do set /a "theLen=%%~zi" 
104.
del "zeichen.tmp" 2>nul 
105.
IF NOT %theLen%==0 GOTO file_error 
106.
IF NOT "%sPart1%"=="%fPart1%" ( 
107.
  set dat_OK=true 
108.
  set fPart1=%sPart1% 
109.
  call :counter %sPart1% Datei %sFILE% 
110.
111.
 
112.
set pruef_len=%sVerz%%sFILE% 
113.
echo %pruef_len% > getlen.tmp 
114.
echo %pruef_len% 
115.
for %%i in ("getlen.tmp") do set /a "theLen=%%~zi-3" & del getlen.tmp 2>nul 
116.
set /a tolong=%theLen%-%len% 
117.
if %theLen% GTR %len% echo %pruef_len%;Um %tolong% Zeichen zu lang >> log.csv 
118.
goto eof 
119.
 
120.
rem ############################################################################## 
121.
 
122.
:file_error 
123.
For /F "tokens=* usebackq" %%a IN (file_error.tmp) DO set zeichen2=%%a & del find.tmp 
124.
del "zeichen.tmp" 2>nul 
125.
del "file_error.tmp" 2>nul 
126.
echo ;%sFILE%;Namenskonvention nicht Eingehalten >> log.csv 
127.
set letzteaktion=Fehlerhaftes Datei %sFILE% in log.csv geschrieben 
128.
goto eof 
129.
 
130.
rem ############################################################################## 
131.
 
132.
:counter 
133.
echo %1%>getlen.tmp 
134.
for %%i in ("getlen.tmp") do set /a "theLen=%%~zi-4" & del getlen.tmp  
135.
call :pruefen_1 %1 %2 %theLen% %3 
136.
goto eof 
137.
 
138.
rem ############################################################################## 
139.
 
140.
:pruefen_1 
141.
set pruefling=%1 
142.
set art=%2 
143.
set laenge=%3 
144.
if %art%==Datei ( 
145.
  set /a laenge=%laenge%+2 
146.
  for /L %%i in (1,1,%laenge%) do call :pruefen_2 %1 %2 %3 %%i %4 
147.
148.
 
149.
if %art%==Verzeichniss ( 
150.
  for /L %%i in (1,1,%laenge%) do call :pruefen_2 %1 %2 %3 %%i 
151.
152.
goto eof 
153.
 
154.
rem ############################################################################## 
155.
 
156.
:pruefen_2 
157.
if %2==Datei ( 
158.
  if %dat_OK%==false goto eof 
159.
160.
if %2==Verzeichniss ( 
161.
  if %verz_OK%==false goto eof 
162.
163.
set zeichen2=NULL 
164.
set pruefling=%1 
165.
set art=%2 
166.
set laenge=%3 
167.
set /a i=%4+1 
168.
set ext=%5 
169.
call set substring=%%pruefling:~%i%,1%% 
170.
For /F "tokens=* usebackq" %%a IN (`echo %substring%`) DO set zeichen=%%a 
171.
echo %zeichen% > zeichen.tmp 
172.
findstr /i "[A-Z-0-9]" zeichen.tmp > find.tmp 
173.
findstr \ zeichen.tmp >> find.tmp 
174.
For /F "tokens=* usebackq" %%a IN (find.tmp) DO set zeichen2=%%a & del find.tmp 
175.
IF NOT %zeichen2%==%zeichen% goto :fehler 
176.
goto eof 
177.
 
178.
rem ############################################################################## 
179.
 
180.
:fehler 
181.
if %art%==Verzeichniss goto verzfehler 
182.
if %art%==Datei goto datfehler 
183.
goto eof 
184.
 
185.
rem ############################################################################## 
186.
 
187.
:verzfehler 
188.
set verz_OK=false 
189.
IF "%lastfalseverz%"=="%pruefling%" goto eof 
190.
set lastfalseverz=%pruefling% 
191.
echo %pruefling%;;Namenskonvention nicht Eingehalten >> log.csv 
192.
set letzteaktion=Fehlerhaftes %art% %pruefling% in log.csv geschrieben 
193.
goto eof 
194.
 
195.
rem ############################################################################## 
196.
 
197.
:datfehler 
198.
set dat_OK=false 
199.
IF "%lastfalsedat%"=="%pruefling%" goto eof 
200.
set lastfalsedat=%pruefling% 
201.
echo ;%ext%;Namenskonvention nicht Eingehalten >> log.csv 
202.
set letzteaktion=Fehlerhafte %art% %ext% in log.csv geschrieben 
203.
goto eof 
204.
 
205.
rem ############################################################################## 
206.
 
207.
:clean 
208.
del "getlen.tmp" 2>nul 
209.
del "zeichen.tmp" 2>nul 
210.
del "file_error.tmp" 2>nul 
211.
del "find.tmp" 2>nul 
212.
goto eof 
213.
 
214.
rem ############################################################################## 
215.
 
216.
:eof
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Batch & Shell
Eventlog Druckjobs mit VBS auslesen (2)

Frage von joni2000de zum Thema Batch & Shell ...

Microsoft Office
gelöst Dropdownlisten in Abhängigkeit mit Leerzeichen im Namen (Datenüberprüfung) (2)

Frage von kevische zum Thema Microsoft Office ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...