Nur bestimmte Ordner mit Batch kopieren (oder verschieben)
Hallo zusammen,
ich bastel schon länger an einem Script um Detail-Abläufe für meine User zu vereinfachen, die nicht so ganz IT-Affin sind, oder einfach, damit nichts vergessen geht...
Ich habe ein simples Anliegen, ich möchte Ordner in ein Archiv kopieren.
Die Datenstruktur sieht (im Beispiel) so aus:
Quelle:
D:\Test
Darin enthalten sind Ordner mit unterschiedlichen Namen, einige fangen mit "GW" an, andere nicht:
D:\Test\GW 12356
D:\Test\78910
D:\Test\11121
D:\Test\GW 31415
Wie gesagt, als Beispiel.
Jetzt möchte ich dem Script folgendes sagen:
Ordnername = GW* -> Kopiere nach E:\Test\GW
Ordnername /= GW* -> Kopiere nach E:\Test
Ich kann auch den Umweg gehen und erstmal alles nach E:\Test kopieren und von dort aus alles was mit "GW*" beginnt nach E:\Test\GW verschieben.
Das habe ich bisher gebaut um überhaupt an die GW* Ordner zu kommen:
Wenn ich den Code ausführe, zeigt mit das Echo genau das an, was ich haben möchte, die beiden Ordner (GW 12356 und GW 31415) werden ins Archiv kopiert.
Führe ich den Code aber dann mit xcopy statt echo aus, kopiert er den Inhalt des Ordners "GW 12356" nach E:\Test\GW und beendet das script.
Denke ich zu kompliziert?
Danke im Voraus für den Input!
ich bastel schon länger an einem Script um Detail-Abläufe für meine User zu vereinfachen, die nicht so ganz IT-Affin sind, oder einfach, damit nichts vergessen geht...
Ich habe ein simples Anliegen, ich möchte Ordner in ein Archiv kopieren.
Die Datenstruktur sieht (im Beispiel) so aus:
Quelle:
D:\Test
Darin enthalten sind Ordner mit unterschiedlichen Namen, einige fangen mit "GW" an, andere nicht:
D:\Test\GW 12356
D:\Test\78910
D:\Test\11121
D:\Test\GW 31415
Wie gesagt, als Beispiel.
Jetzt möchte ich dem Script folgendes sagen:
Ordnername = GW* -> Kopiere nach E:\Test\GW
Ordnername /= GW* -> Kopiere nach E:\Test
Ich kann auch den Umweg gehen und erstmal alles nach E:\Test kopieren und von dort aus alles was mit "GW*" beginnt nach E:\Test\GW verschieben.
Das habe ich bisher gebaut um überhaupt an die GW* Ordner zu kommen:
@echo off & setlocal
set "archiv=D:\Test\"
set "rootfolder=E:\Test\GW\"
for /f "tokens=*" %%g in ('dir /ad /b %rootfolder%GW*') do (echo "%rootfolder%%%g" %archiv%%date:~-4%\%month%%month2%%date:~-10,2%.%date:~-7,2%.%date:~-4%\* /S /E /D /Y)
Wenn ich den Code ausführe, zeigt mit das Echo genau das an, was ich haben möchte, die beiden Ordner (GW 12356 und GW 31415) werden ins Archiv kopiert.
Führe ich den Code aber dann mit xcopy statt echo aus, kopiert er den Inhalt des Ordners "GW 12356" nach E:\Test\GW und beendet das script.
Denke ich zu kompliziert?
Danke im Voraus für den Input!
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 566941
Url: https://administrator.de/contentid/566941
Ausgedruckt am: 24.11.2024 um 16:11 Uhr
12 Kommentare
Neuester Kommentar
Zitat von @Motaki:
xcopy "%rootfolder%%%g" %archiv%%date:~-4%\%month%%month2%%date:~-10,2%.%date:~-7,2%.%date:~-4%\* /S /E /D /Y)
Da ist der Inhalt der Variablen nicht ersichtlich. Es müsste doch eigentlich so beginnen:
xcopy d:\test\gw*
Moin,
was für ein Geraffel mit dem Batch. Hier mal ein Lösungsvorschlag mit Powershell:
Liebe Grüße
Erik
was für ein Geraffel mit dem Batch. Hier mal ein Lösungsvorschlag mit Powershell:
$dirs = get-childitem -path "C:\data" -directory
$month = new-item -path "e:\archivedata" -name $(date -format "MMMM") -ItemType Directory
$gw = New-Item -path "e:\archivedata\$(date -format "MMMM")\" -name "GW" -ItemType Directory
foreach($dir in $dirs) {
if($dir.Name -like "GW*"){
move-item -path $dir.fullname -destination $gw
}
else {
move-item -path $dir.fullname -destination $month
}
}
Liebe Grüße
Erik
Zitat von @Motaki:
wenn ich einfach
mache, verschiebt er den Inhalt des ersten GW* Ordners nach E:\Test\GW
wenn ich einfach
> move D:\Test\GW* E:\Test\GW
mache, verschiebt er den Inhalt des ersten GW* Ordners nach E:\Test\GW
Ich habe mal eine 10 Sekunden Recherche gemacht und der erste Treffer meinte bereits, dass der Move Befehl kein "rekursiv" kennt. Eine Prüfung mit
move /?
Versuche es mal so:
robocopy d:\test\GW* e:\test\gw\ /S /MOV
robocopy d:\test\* e:\test\ /S /MOV
Die erste Zeile schieb alle gw* Ordner weg, die zweite Zeile dann den Rest.
Du kannst es aber auch so versuchen:
xcopy D:\Test\GW* E:\Test\GW /s
del d:\test\gw* /s
xcopy D:\Test\* E:\Test\ /s
del d:\test\* /s
Habs nicht getestet...
Moin,
Dann lerne es. Ganz ehrlich, wenn ich mir das angucke:
dann kriege ich eine Krise. Das ist Programmiersteinzeit. Das schreibe ich in der PS alles in eine Zeile.
Ordner mit dem richtigen Namen erzeugt und als Objektreferenz in die Variable $month geschrieben.
Und die Weiterverwendung wird auch viel übersichtlicher und einfacher. Abgesehen mal davon, das die Fehlerbehandlung in der Batch nochmal richtig nett wird. Was passiert z. B., wenn der Zielordner schon existiert?
Welche Ordnung meinst Du?
Mein Skript macht komplett das, was Du wolltest. Naja, es fehlt noch das Tagesdatum. Aber das sollte ja kein Problem sein, das Skript schnell anzupassen.
Gerne.
Liebe Grüße
Erik
Ich hab perse nichts gegen Powershell, ich kanns einfach nur gar nicht ^^
Dann lerne es. Ganz ehrlich, wenn ich mir das angucke:
set "month=%date:~-7,2%"
set "gwyear=GW_%date:~-4%"
if "%month%" == "01" set month2=_Januar
if "%month%" == "02" set month2=_Februar
if "%month%" == "03" set month2=_März
if "%month%" == "04" set month2=_April
if "%month%" == "05" set month2=_Mai
if "%month%" == "06" set month2=_Juni
if "%month%" == "07" set month2=_Juli
if "%month%" == "08" set month2=_August
if "%month%" == "09" set month2=_September
if "%month%" == "10" set month2=_Oktober
if "%month%" == "11" set month2=_November
if "%month%" == "12" set month2=_Dezember
set "gwyear=GW_%date:~-4%"
if "%month%" == "01" set month2=_Januar
if "%month%" == "02" set month2=_Februar
if "%month%" == "03" set month2=_März
if "%month%" == "04" set month2=_April
if "%month%" == "05" set month2=_Mai
if "%month%" == "06" set month2=_Juni
if "%month%" == "07" set month2=_Juli
if "%month%" == "08" set month2=_August
if "%month%" == "09" set month2=_September
if "%month%" == "10" set month2=_Oktober
if "%month%" == "11" set month2=_November
if "%month%" == "12" set month2=_Dezember
dann kriege ich eine Krise. Das ist Programmiersteinzeit. Das schreibe ich in der PS alles in eine Zeile.
$month = new-item -path "e:\archivedata" -name $(date -format "MM_MMMM") -ItemType Directory
Ordner mit dem richtigen Namen erzeugt und als Objektreferenz in die Variable $month geschrieben.
Und die Weiterverwendung wird auch viel übersichtlicher und einfacher. Abgesehen mal davon, das die Fehlerbehandlung in der Batch nochmal richtig nett wird. Was passiert z. B., wenn der Zielordner schon existiert?
Die Ordnung muss auch beibehalten werden, da bereits andere Software darauf zugreift, wie das halt immer so ist.
Welche Ordnung meinst Du?
Geht das auch, evtl. eleganter in Powershell?
Mein Skript macht komplett das, was Du wolltest. Naja, es fehlt noch das Tagesdatum. Aber das sollte ja kein Problem sein, das Skript schnell anzupassen.
Danke soweit!
Gerne.
Liebe Grüße
Erik