115129
Goto Top

Namensvergleich von Unterverzeichnisse

Hallo allerseits,
ich bin neu in diesem Forum und möchte an erster Stelle alle recht herzlich Grüßen face-smile

Ein Script wird gesucht, welches folgender Ablauf aufweisen kann:

Voreinstellungen, die ich im Skript eintragen müsste:
- Pfadangabe eines Hauptverzeichnis (z.B. C:\Hauptverzeichnis\)
- Pfadangabe von 9 Nebenverzeichnisse (z.B. D:\Nebenverzeichnis1\ , D:\Nebenverzeichnis2\ , etc.)

Im Hauptverzeichnis befinden sich Kopien des Inhalts aller Nebenverzeichnisse.
Angenommen ein Unterordner innerhalb eines Nebenverzeichnisses wird gelöscht...dann wäre die Kopie im Hauptverzeichnis noch vorhanden.
Das Skript soll die Ordnernamen im Hauptverzeichnis auslesen; danach die Ordnernamen unter den Nebenverzeichnisse. Dies mache ich im Moment wie folgt:

@echo off
del C:\HV\log-HV.txt
del C:\HV\log-NV.txt
dir C:\HV\ /A:D /B /S > C:\HV\log-HV.txt
dir C:\NV1 C:\NV2 C:\NV3 C:\NV4 C:\NV5 C:\NV6 C:\NV7 C:\NV8 C:\NV9 /A:D /B /S > C:\HV\log-NV.txt

Nun muss ein Vergleich zwischen beider Textdateien stattfinden, das Problem sind unterschiedliche Ordnernamen (siehe nächste Zeile):
log-HV.txt ---> z.B. 01 - Outlook - irgendeintext
log-NV.txt ---> z.B. Outlook
Es muss demnach immer der Ordnername bzw. die Variable "Outlook" (Inhalt von log-NV.txt) ausgelesen und im Hauptverzeichnis gesucht werden. Wurde der Ordner "Outlook" unter einem Nebenverzeichnis gelöscht, soll der vorhandene unter Hauptverzeichnis ebenfalls gelöscht werden.

Meine Suchaktionen im Internet waren bis jetzt alle erfolglos, in der Hoffnung eine ähnliche Aufgabenstellung zu finden.

Wäre mein Vorhaben ohne großen Aufwand umzusetzen?

Vielen Dank schon mal im voraus.

EDIT: Es kann auch Powershell oder VBS sein, ich möchte es in die Windows-Aufgabenplanung integrieren.

Content-Key: 230164

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

Printed on: April 24, 2024 at 15:04 o'clock

Member: Endoro
Endoro Feb 18, 2014 at 09:28:11 (UTC)
Goto Top
Hey,
log-HV.txt ---> z.B. 01 - Outlook - irgendeintext
log-NV.txt ---> z.B. Outlook

was meinst du mit 'z.B.', können noch andere Strukturen auftreten?
Was ist mit der "Variable Outlook", ich sehe die nicht?
Gruss.
Mitglied: 115129
115129 Feb 18, 2014 at 11:11:38 (UTC)
Goto Top
Hallo Endoro,

Danke für deine rasche Antwort.

Outlook ist ein Ordnername und somit nur ein Beispiel...
Die Ordnernamen in den Nebenverzeichnissen sind unterschiedlich.
Diese werden unter das Hauptverzeichnis kopiert und es ändert sich der Ordnername zu "01 - Outlook - irgendeintext" (Zahl davor und Text danach ebenfalls).
Es soll wie unten im Beispiel der Ordnername unter Hauptverzeichnis zwischen den Bindestrichen " - Outlook - " ausgelesen und wenn dieser in einer der Nebenverzeichnisse nicht mehr verfügbar ist, gelöscht werden.

Beispiel:
Outlook ---> unter Nebenverzeichnisse
01 - Outlook - irgendeintext ---> unter Hauptverzeichnis

Grüße
Member: Endoro
Endoro Feb 18, 2014 at 12:01:33 (UTC)
Goto Top
Ok, das Hauptverzeichnis soll gescannt werden; ist der Ordner nicht irgendwo in den Nebenverzeichnissen --> löschen.
Warum von einer TXT und nicht direkt?
Member: bastla
bastla Feb 18, 2014 updated at 21:54:08 (UTC)
Goto Top
Hallo BlattlausOG und willkommen im Forum!

Unter der Annahme, dass die Ordnernamen des Hauptverzeichnisses tatsächlich immer dem angegebenen Schema ensprechen (inkl der Leerzeichen vor und nach den "-"), könnte das etwa so gehen (ungetestet):
@echo off & setlocal
set "HV=D:\Hauptverzeichnis"  
set "NV=C:\NV1 C:\NV2 C:\NV3 C:\NV4 C:\NV5 C:\NV6 C:\NV7 C:\NV8 C:\NV9"  

set "Liste=%temp%\log-NV.txt"  
>"%Liste%" dir /b/a-d %NV%  

for /d %%i in ("%HV%\*") do for /f "tokens=2 delims=-" %%a in ("%%~nxi") do (  
    set "Ordner=%%a"  
    setlocal enabledelayedexpansion
    findstr /ixc:"!Ordner:~1,-1!" "%Liste%">nul || echo rd /s /q "%%i"  
    endlocal
)
pause
Es wird hier nur die erste Unterordnerebene der Nebenverzeichnisse überprüft und Groß-/Kleinschreibung ignoriert. Wegen des "echo" vor dem "rd" werden (zum gefahrlosen Testen) die Ordner-Lösch-Befehle nur angezeigt, aber nicht ausgeführt ...
@ Endoro
Warum von einer TXT und nicht direkt?
Performancegründe?

Grüße
bastla

[Edit] %-Zeichen in Zeile 6 ergänzt [/Edit]
Mitglied: 115129
115129 Feb 18, 2014 updated at 21:14:54 (UTC)
Goto Top
Hallo bastla,

ich habe das Script angepasst, Testverzeichnisse erstellt und getestet:
@echo off & setlocal
set "HV=C:\_SCRIPT-TEST\_TEST"  
set "NV=C:\_SCRIPT-TEST\_TEST1 C:\_SCRIPT-TEST\_TEST2 C:\_SCRIPT-TEST\_TEST3"  

set "Liste=%temp%\TEST-log.txt"  
>"%Liste%" dir /b/a-d %NV  

for /d %%i in ("%HV%\*") do for /f "tokens=2 delims=-" %%a in ("%%~nxi") do (  
    set "Ordner=%%a"  
    setlocal enabledelayedexpansion
    findstr /ixc:"!Ordner:~1,-1!" "%Liste%">nul || rd /s /q "%%i"  
    endlocal
)
pause
Nach dem Ausführen wird alles unter _TEST gelöscht, ob Unterverzeichnisse in _TEST1/_TEST2/_TEST3 drin liegen oder nicht. Was läuft falsch?


Inhalt der Test-log.txt sieht wie folgt aus (Hauptverzeichnis)
01 - TEST1 - 2ehdtwhetdt3
02 - TEST2 - j87zuzvutzb
03 - TEST3 - nu7hubztubi88oi

Inhalt der Test-log123.txt sieht wie folgt aus (Nebenverzeichnisse)
TEST1
TEST2
TEST3

Hiemt werden die logs erstellt:
@echo off
del C:\_SCRIPT-TEST\_TEST\TEST-log.txt
del C:\_SCRIPT-TEST\_TEST\TEST123-log.txt
dir C:\_SCRIPT-TEST\_TEST /A:D /B > C:\_SCRIPT-TEST\_TEST\TEST-log.txt
dir C:\_SCRIPT-TEST\_TEST1 C:\_SCRIPT-TEST\_TEST2 C:\_SCRIPT-TEST\_TEST3 /A:D /B > C:\_SCRIPT-TEST\_TEST\TEST123-log.txt

Falls ich das TEST2-Verzeichnis manuell löschen würde und ich führe das Log-Script aus sieht`s so aus:
Test-log.txt (Hauptverzeichnis)
01 - TEST1 - 2ehdtwhetdt3
02 - TEST2 - j87zuzvutzb
03 - TEST3 - nu7hubztubi88oi
Test-log123.txt (Nebenverzeichnisse)
TEST1
TEST3

Nun soll das neue Script lediglich erkennen, dass das TEST2-Verzeichnis fehlt und mir das Verzeichnis "02 - TEST2 - j87zuzvutzb" löschen.

Würden dann noch zu Beginn dieses Scripts die logs vorab erstellt werden, also all-in-one wäre alles PERFEKT. 8)

Grüße

@Endoro: Ob von einer Textdatei oder direkt alles über den Code ist mir egal, eigentlich wäre eine Batch-Datei willkommener. Ich habe den Weg über zusammengesuchte Informationen des Internets eingeschlagen, um ggfls. selbst das Vorhaben umzusetzen, doch ich habs eingesehen dass es ohne gute Programmierkenntnisse schwierig wird.
Member: Endoro
Endoro Feb 18, 2014 updated at 21:32:02 (UTC)
Goto Top
Ungetestet etwa so:
@ECHO OFF &SETLOCAL enableDelayedExpansion
FOR /d %%a IN (C:\NV1\* C:\NV2\* C:\NV3\* C:\NV4\* C:\NV5\* C:\NV6\* C:\NV7\* C:\NV8\* C:\NV9\*) DO SET "$%%~na=%%~na"  
FOR /d %%a IN (C:\HV\*) DO FOR /f "tokens=2delims=- " %%b IN ("%%~na") DO IF NOT DEFINED $%%b RD /s /q "%%~a"  
Das funktioniert nicht mit Ordnern, die Leer- oder Sonderzeichen enthalten.
Gruss.
Member: bastla
bastla Feb 18, 2014 updated at 21:57:59 (UTC)
Goto Top
Hallo BlattlausOG!

Ich hatte das so verstanden, dass mit Unterordnern der "Nebenverzeichnisse" verglichen werden sollte - wenn es keine gibt, ist natürlich die "TEST-log.txt" (wird in Zeile 6 neu erstellt) leer und damit sind alle Unterverzeichnisse von "_TEST" überflüssig ...
Würden dann noch zu Beginn dieses Scripts die logs vorab erstellt werden, also all-in-one wäre alles PERFEKT. 8)
Es wird, wie erwähnt, die Liste der unmittelbaren Unterordner der "Nebenverzeichnisse" erstellt - für die Unterverzeichnisse des "Hauptverzeichnisses" braucht es keine Liste, da diese direkt ausgewertet werden.

Wenn Du darauf bestehst, können natürlich auch beide Listen erstellt und dann verglichen werden - das sähe dann so aus:
@echo off & setlocal
del C:\_SCRIPT-TEST\_TEST\TEST-log.txt
del C:\_SCRIPT-TEST\_TEST\TEST123-log.txt
dir C:\_SCRIPT-TEST\_TEST /A:D /B > C:\_SCRIPT-TEST\_TEST\TEST-log.txt
dir C:\_SCRIPT-TEST\_TEST1 C:\_SCRIPT-TEST\_TEST2 C:\_SCRIPT-TEST\_TEST3 /A:D /B > C:\_SCRIPT-TEST\_TEST\TEST123-log.txt

for /f "usebackq tokens=2 delims=-" %%a in ("C:\_SCRIPT-TEST\_TEST\TEST-log.txt") do (   
    set "Ordner=%%a"   
    setlocal enabledelayedexpansion 
    findstr /ixc:"!Ordner:~1,-1!" "C:\_SCRIPT-TEST\_TEST\TEST123-log.txt" >nul || rd /s /q "%%i"  
    endlocal 
)
Grüße
bastla
Mitglied: 115129
115129 Feb 18, 2014, updated at Feb 19, 2014 at 00:15:44 (UTC)
Goto Top
@Endoro:
Leider besitzen meine Ordnernamen Leerzeichen, somit scheidet dein obiger Code aus.
Grüße

@bastla:
Habe eben dein geposteten Code getestet, leider passiert nun gar nichts.
Lösche ich manuell wieder den Ordner C:\_SCRIPT-TEST\_TEST2\Test2 und führe im Anschluss dein Script aus, bleibt der Ordner C:\_SCRIPT-TEST\_TEST\02 - TEST2 - j87zuzvutzb bestehen bzw. wird nicht gelöscht face-sad
Irgendwas stimmt noch nicht.

Inhalt der Test-log123.txt nach dem Ausführen:
TEST1
TEST3

Inhalt der Test-log.txt nach dem Ausführen:
01 - TEST1 - 2ehdtwhetdt3
02 - TEST2 - j87zuzvutzb
03 - TEST3 - nu7hubztubi88oi

Aber vielen Dank nochmals für Eure Hilfe.
Member: Endoro
Endoro Feb 18, 2014 at 22:35:23 (UTC)
Goto Top
Zitat von @115129:

@Endoro:
Leider besitzen meine Ordnernamen Leerzeichen, somit scheidet dein obiger Code aus.

Ich meinte die Ordner in den Nebenverzeichnissen. Dass die im Hauptverzeichnis spaces haben, ist klar.
Mitglied: 115129
115129 Feb 18, 2014 updated at 22:44:44 (UTC)
Goto Top
Hallo Endoro,

habe soeben dein Quellcode getestet, echt komisch...das gleiche Phänomen wie bei "bastla", siehe oben.

Hier dein Code, den ich meinen Testpfaden angepasst habe:
@ECHO OFF &SETLOCAL enableDelayedExpansion
FOR /d %%a IN (C:\_SCRIPT-TEST\_TEST1\* C:\_SCRIPT-TEST\_TEST2\* C:\_SCRIPT-TEST\_TEST3\*) DO SET "$%%~na=%%~na"  
FOR /d %%a IN (C:\_SCRIPT-TEST\_TEST\*) DO FOR /f "tokens=2delims=- " %%b IN ("%%~na") DO IF NOT DEFINED $%%b RD /s /q "%%~a"  
Member: Endoro
Endoro Feb 18, 2014 at 23:08:32 (UTC)
Goto Top
Das ist nicht komisch, sondern entspricht deinen Vorgaben. Test1 ist in einem Nebenverzeichnis vorhanden und wird im HV nicht gelöscht.
Mitglied: 115129
115129 Feb 18, 2014, updated at Feb 19, 2014 at 16:36:21 (UTC)
Goto Top
Entschuldige, war ein Schreibfehler.
Habe es gerade nochmal getestet und angepasst...siehe Post vom 18.02.2014 um 23:18 Uhr oder weiter unten.
Die gewünschte Arbeitsweise die das Script abarbeiten soll stimmt aber ;)

Habe eben dein geposteten Code getestet, leider passiert nun gar nichts.
Lösche ich manuell wieder den Ordner C:\_SCRIPT-TEST\_TEST2\Test2 und führe im Anschluss dein Script aus, bleibt der Ordner C:\_SCRIPT-TEST\_TEST\02 - TEST2 - j87zuzvutzb bestehen bzw. wird nicht gelöscht.

Irgendwas stimmt noch nicht.

Inhalt der Test-log123.txt nach dem Ausführen:
TEST1 
TEST3

Inhalt der Test-log.txt nach dem Ausführen:
01 - TEST1 - 2ehdtwhetdt3 
02 - TEST2 - j87zuzvutzb 
03 - TEST3 - nu7hubztubi88oi

Das Verzeichnis "02 - TEST2 - j87zuzvutzb " soll in diesem Fall gelöscht werden.

Würde sich nochmal jemand der Sache annehmen face-smile
Vielen Dank.
Member: Endoro
Endoro Feb 19, 2014 at 18:01:25 (UTC)
Goto Top
Hmm, wenn ich das hier nachstelle, wird zuverlässig jeder Ordner im HV gelöscht, der keine Entsprechung in den NV hat. Warum auch sollte gerade dein TEST2 eine Ausnahme sein? VLlt ein UAC-Problem?
Mitglied: 115129
115129 Feb 19, 2014 updated at 18:24:37 (UTC)
Goto Top
Hi Endoro,

schön von dir zu lesen.

Du hast es bald geschafft...ich beginne langsam an mir zu zweifeln.

Benutzerkontensteuerung ist bei mir immer ausgeschaltet bzw. auf unterster Stufe.
Das Skript bzw. beide die gepostet wurden habe ich auch auf einem anderen Notebook getestet, da funktionierte es auch nicht.

Wäre es viel Arbeit für dich, wenn du mir dein Skript mit Kommentare versiehst, damit ich komplett folgen kann was wo geschieht?
Manche Dinge kenne ich nicht, vor allem wenns um diese Kürzel-Prozent-Hieroglyphen geht ;)

Dankesehr.

Grüße
Member: Endoro
Endoro Feb 19, 2014 at 19:05:20 (UTC)
Goto Top
Es sind ja nur drei Zeilen. Die erste For-Schleife liest die erste Unterordnerebene jedes NV ein und speichert den Ordnernamen in je einer Variablen. Die beiden nächsten durchsuchen das HV und vergleichen die erste Ebene der Unterordner des HV mit den gespeicherten Variablen der NV. Hat der HV Subordner keine entsprechende NV Variable, wird er gelöscht.
Gruss.
Mitglied: 115129
115129 Feb 19, 2014 at 19:52:14 (UTC)
Goto Top
Kann es daran liegen dass das Script bei mir nicht funktioniert, da unter Ordnereigenschaften der manuell angelegten Verzeichnisse der Schreibschutz aktiv ist? Komisch ist, dass immer wenn ich diesen deaktiviere und ich rufe die Eigenschaften wieder auf, der Schreibschutz wieder aktiviert ist. oO
Member: Endoro
Endoro Feb 19, 2014 at 19:56:52 (UTC)
Goto Top
Das wäre der Fall, wenn du keine Berechtigung dazu hast. Dann müsste eine Fehlermeldung kommen.
Mitglied: 115129
115129 Feb 19, 2014 updated at 23:17:52 (UTC)
Goto Top
Guten Abend,

für heute Abend gebe ich auf...komme mir vor wie auf einem Karusell...

Hier mal mein angepasstes Script von Bastla mit neuen Verzeichnisnamen:
@echo off & setlocal
del C:\TEST\HV-log.txt
del C:\TEST\NVs-log.txt
dir C:\TEST\HV\* /A:D /B /s > C:\TEST\HV-log.txt
dir C:\TEST\NV1\* C:\TEST\NV2\* C:\TEST\NV3\* /A:D /B /s > C:\TEST\NVs-log.txt

for /f "usebackq tokens=2 delims=-" %%a in ("C:\TEST\HV-log.txt") do (   
    set "Ordner=%%a"   
    setlocal enabledelayedexpansion 
    findstr /ixc:"!Ordner:~1,-1!" "C:\TEST\NVs-log.txt" >nul || rd /s /q "%%i"  
    endlocal 
)
Hier die HV-log-Datei nach dem Ausführen, wenn kein Unterverzeichnis in NV1 vorhanden:
C:\TEST\HV\01 - TEST1 - 2ehdtwhetdt3
C:\TEST\HV\02 - TEST2 - rgtrhnfzmju
C:\TEST\HV\03 - TEST3 - nu7hubztubi88oi
Hier die NV-log-Datei nach dem Ausführen, wenn kein Unterverzeichnis in NV1 vorhanden:
C:\TEST\NV2\TEST2
C:\TEST\NV3\TEST3
Fazit: Das Script führt keine Aktion aus...es sollte aber im Verzeichnis HV das Unterverzeichnis 01 - TEST1 - 2ehdtwhetdt3 löschen, da sich Test1 was nun nicht mehr existiert unter NV1 befand.


Nun mein angepasstes Script von Endoro mit neuen Verzeichnisnamen:
@ECHO OFF &SETLOCAL enableDelayedExpansion 
FOR /d %%a IN ("C:\TEST\NV1\* C:\TEST\NV2\* C:\TEST\NV3\*") DO SET "$%%~na=%%~na"   
FOR /d %%a IN ("C:\TEST\HV\*") DO FOR /f "tokens=2delims=- " %%b IN ("%%~na") DO IF NOT DEFINED $%%b RD /s /q "%%~a"  
Fazit: Das Script führt eine Aktion aus...allerdings löscht es mir alle Unterverzeichnisse unter HV:
01 - TEST1 - 2ehdtwhetdt3
02 - TEST2 - rgtrhnfzmju
03 - TEST3 - nu7hubztubi88oi
Richtig wäre: Es sollte im Verzeichnis HV nur das Unterverzeichnis 01 - TEST1 - 2ehdtwhetdt3 löschen, da sich Test1 was nun nicht mehr existiert unter NV1 befand.

Die Pfadangaben habe ich absichtlich mit rein genommen, um Euch eine bessere Übersicht der Ordnerstrukturen zeigen zu können.

Könnte Ihr nochmal drüber schauen, bitte?

Vielen vielen Dank face-smile
Member: Endoro
Solution Endoro Feb 19, 2014, updated at Feb 20, 2014 at 00:17:58 (UTC)
Goto Top
Also wenn ich den Fehler entferne, den du eingebaut hast, gehts:
@ECHO OFF &SETLOCAL enableDelayedExpansion 
FOR /d %%a IN (C:\TEST\NV1\* C:\TEST\NV2\* C:\TEST\NV3\*) DO SET "$%%~na=%%~na"   
FOR /d %%a IN ("C:\TEST\HV\*") DO FOR /f "tokens=2delims=- " %%b IN ("%%~na") DO IF NOT DEFINED $%%b RD /s /q "%%~a"  
Gruss.
Mitglied: 115129
115129 Feb 20, 2014 at 00:17:44 (UTC)
Goto Top
YEAHYEAHYEAH face-smile

Vielen Dank Endoro, funktioniert 1a.
...der Fehler...wie kommen die nur dahin?...


Bis Bald.

Grüße