Batch script zum suchen und kopieren von Ordnern

OneManArmy

Enthusiast
Thread Starter
Mitglied seit
04.06.2004
Beiträge
1.911
Hallo,

ich habe eine etwas umfangreichere Kopieraktion vor mir, die in der Form eigentlich nur mit Hilfe eines Batch Scriptes bewältigt werden kann.
Es soll mir ermöglichen nach bestimmten Ordnern in einem Verzeichnisbaum zu suchen (bis drei Verzeichnisebenen tief).
Die Namen der Ordner, nach denen gesucht werden soll, befinden sich in einer *.txt Datei (ein Ordner pro Zeile bei ca. 40k Zeilen).
Die Ordnernamen enthalten hin und wieder "." oder "-".

Der Ablauf soll wie folgt aussehen:

Textdatei soll zeilenweise ausgelesen werden.
Wenn einer der Ordner gefunden wird, soll er per Robocopy kopiert werden.
Nach erfolgtem Kopiervorgang soll der Eintrag aus der txt Datei entfernt werden.
Die nicht gefundenen Ordnernamen verbleiben in der txt.

Primär geht es darum, die Suche vernünftig in Gang zu bringen und die Übergabe zu Robocopy.
Außerdem ist es wichtig, dass die Verzeichnisstruktur erhalten bleibt (sämtliche Elternverzeichnisse) und mit kopiert wird.
Meine bisherigen Versuche mit "for /f", "findstr" etc. verliefen leider nur teilweise erfolgreich und langsam komme ich auch zeitlich in Bedrängnis.

Hier tummeln sich viele Leute rum, die sehr viel mehr vom Scripting verstehen als ich, darum bitte ich um Mithilfe :)

Gruß,
Martin
 
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Moin,
ich hab da mal was gebaut.

Code:
# pfad zur quelldatei
$daten = Get-Content "C:\temp\deine_verzeichnisliste.txt"

# pfad wo die daten hinkopiert werden müssen
$neuerpfad = "D:\Daten\"

# ausgabedateien
$erfolgreich = "C:\temp\erfolgreich_kopiert.txt"
$fehlgeschlagen = "C:\temp\fehlgeschlagen.txt"

# datum
$date = Get-Date

write-host "script gestartet um " $date

# wenn die ausgabedateien vorhanden sind, loesche sie
If (Test-Path $erfolgreich){Remove-Item -path $erfolgreich}
If (Test-Path $fehlgeschlagen){Remove-Item -path $fehlgeschlagen}

#für jede zeile in deine liste
foreach ($pfad in $daten)
{	
	# wenn der pfad nicht gefunden wurde ...
	If 	((Test-Path -path $pfad) -ne $True)
		{
		# schreibe den pfad in die fehlgeschlagen.txt
		write-host $pfad "nicht gefunden"
		$pfad | out-file -filepath $fehlgeschlagen -append
		}
	# wenn der pfad gefunden wurde ...	
	else	{
		# starte den copy befehl
		copy-item -path $pfad -destination $neuerpfad -Recurse
		# schreibe den pfad in die erfolgreich.txt
		write-host $pfad "erfolgreich kopiert"
		$pfad | out-file -filepath $erfolgreich -append
		}	
}

write-host "script beendet um " $date

Das Script als .ps1 datei abspeichern, die Variablen oben anpassen und Powershell natürlich mit den richtigen Rechten starten.

Ich hoffe es hilft dir weiter.

Gruß,
ott
 
Hi,

erstmal vielen Dank! Script funktioniert soweit teilweise. Kann man das ganze noch so anpassen, dass alle Unterordner rekursiv durchsucht werden? Nach jetzigem Stand müsste ich das Script in sämtliche Unterordner kopieren und ausführen, in denen ich die gesuchten Ordner vermute... und das sind einige :/

Gruß,
Martin
 
Zuletzt bearbeitet:
Moin,

der Ausführungsort ist völlig egal.
Es ist natürlich wichtig, dass die Variablen vollständige Pfade enthalten, also c:\temp\datei.txt und nicht .\datei.txt

Ich habe es grad auch nochmal auf einem anderen PC ausprobiert und von verschiedenen Platten und Netzlaufwerken Daten kopiert.
Deine Datei mit den Ordnerliste muss natürlich auch vollständige Pfade enthalten, z.B.:

C:\ordner\unterordner\
x:\ordner\unterordner\user\
...

\\edit

Ohhhh, kann es sein, dass du den Pfad gar nicht weist?
Du hast nur die Ordnernamen und die sollen wirklich gesucht werden?
 
Zuletzt bearbeitet:
Oha,
da muss ich mir heute Abend nochmal Gedanken drüber machen.
Zu dem eigentlichen Kopiervorgang kommt dann natürlich die Suche.

Ein erster theoretischer Ansatz wäre es, die komplette Dateistruktur der Quelllaufwerke in eine Textdatei zu schreiben und diese dann mit deiner Ordnerliste abzugleichen. Immer wenn ein Ordnername mit Infromationen in der Dateistrukturliste übereinstimmt, wird dieser kopiert.
Also erstes Script: Suchindex erstellen
Zweites Script: Übereinstimmungen kopieren
 
Leuchtet ein. Sowas in der Art hatte ich bereits mit einer for /f Schleife probiert... probiert. Die gesuchten Ordnerpfade hatte ich sogar in eine .txt kopiert bekommen. Nur mit dem Kopiervorgang hatte es nicht hingehauen.
 
Ein erster theoretischer Ansatz wäre es, die komplette Dateistruktur der Quelllaufwerke in eine Textdatei zu schreiben und diese dann mit deiner Ordnerliste abzugleichen. Immer wenn ein Ordnername mit Infromationen in der Dateistrukturliste übereinstimmt, wird dieser kopiert.
Also erstes Script: Suchindex erstellen
Zweites Script: Übereinstimmungen kopieren

Sehe ich genau so, wenn für jede Zeile der "Quelldatei" ein kompletter, rekursiver Scan über das Laufwerk angetreten würde ... naja, dann würde das auf jeden Fall ein paar Takte dauern. Sowas in der Art wie

Code:
Get-ChildItem C:\ -recursive | where {$_.PSIsCOntainer} | select FullName

würde ja schon reichen um die aktuelle Struktur einmal komplett aufzunehmen. Suchen in einer Ziel-Text mit zig-hundertausend Zeilen ist zwar immernoch blöd aber besser als ein rekursiver Scan über Verzeichnisse ... ;)
 
Zuletzt bearbeitet:
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh