motaki
Goto Top

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:

@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!

Content-ID: 566941

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

Ausgedruckt am: 24.11.2024 um 16:11 Uhr

NordicMike
NordicMike 23.04.2020 um 14:00:39 Uhr
Goto Top
Wie sieht denn dein xcopy befehl aus?
Motaki
Motaki 23.04.2020 um 14:02:53 Uhr
Goto Top
So wie er oben steht, nur eben mit xcopy:
xcopy "%rootfolder%%%g" %archiv%%date:~-4%\%month%%month2%%date:~-10,2%.%date:~-7,2%.%date:~-4%\* /S /E /D /Y)  
Apophis
Apophis 23.04.2020 um 15:19:08 Uhr
Goto Top
Hallo,

also ich hätte ja mit XCOPY alles in das Archiv der Nicht-GW-Ordner kopiert und als zweiten Schritt alles, was im Archiv mit GW beginnt per MOVE in das Archiv der GW-Ordner.

Gruß
Apophis
NordicMike
NordicMike 23.04.2020 um 15:24:01 Uhr
Goto Top
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* 
Motaki
Motaki 23.04.2020 um 15:57:05 Uhr
Goto Top
Wie bekomme ich das denn hin?

wenn ich einfach
move D:\Test\GW* E:\Test\GW

mache, verschiebt er den Inhalt des ersten GW* Ordners nach E:\Test\GW
Motaki
Motaki 23.04.2020 aktualisiert um 17:00:04 Uhr
Goto Top
xcopy "%rootfolder%%%g" %archiv%%date:~-4%\%month%%month2%%date:~-10,2%.%date:~-7,2%.%date:~-4%\* /S /E /D /Y)

sorry.

ohne Variable :

xcopy "%%g" E:\Test\GW\04_April\23.04.2020\* /S /E /D /Y

einfach xcopy D:\Test\GW* E:\Test\GW funktioniert nicht -> Datei GW* nicht gefunden.


Edit:

Mir kam eben die Erleuchtung (fast)
was fehlt ist der Ordner im Ziel, bekomme ich aus der Variable %%g (D:\Test\GW 12356) den Pfad gelöscht, sodass nur GW 12356 in der Variable steht?
erikro
erikro 23.04.2020 um 18:15:25 Uhr
Goto Top
Moin,

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
Motaki
Motaki 24.04.2020 um 08:07:23 Uhr
Goto Top
Super Sache!

Ich hab perse nichts gegen Powershell, ich kanns einfach nur gar nicht ^^

Dann muss ich aber auch mit den dateipfaden rausrücken, dafür poste ich einfach mal den aktuellen Code der funktioniert um den Dateipfad zu finden:

@echo off
set "archiv=D:\Archiv\"  
set "rootfolder=D:\Produkte\"  
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  

Der Zielpfad heißt dann z.B.:
%archiv%%date:~-4%\%month%%month2%\%date:~-10,2%.%date:~-7,2%.%date:~-4%
D:\Produkte\2020\04_April\23.04.2020

bzw. entsprechend für die GW Produkte:

%archiv%%gwyear%\%month%%month2%\%date:~-10,2%.%date:~-7,2%.%date:~-4%
D:\Produkte\GW_2020\04_April\23.04.2020

Die Ordnung muss auch beibehalten werden, da bereits andere Software darauf zugreift, wie das halt immer so ist.

Geht das auch, evtl. eleganter in Powershell?
Oder ich nutze das Powershell script einfach nur um die beiden Ordner-Arten zu trennen und mache den Rest mit einem Bat Aufruf innerhalb der Powershell?

Danke soweit!
NordicMike
Lösung NordicMike 24.04.2020 aktualisiert um 08:40:11 Uhr
Goto Top
Zitat von @Motaki:
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 /?
bestätigte das auch. Solche Arbeiten solltest du jetzt als Administrator selbst drauf haben ;c)

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...
erikro
erikro 24.04.2020 um 08:54:07 Uhr
Goto Top
Moin,

Zitat von @Motaki:

Super Sache!

face-smile

Ich hab perse nichts gegen Powershell, ich kanns einfach nur gar nicht ^^

Dann lerne es. face-wink 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



dann kriege ich eine Krise. Das ist Programmiersteinzeit. face-wink 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
Motaki
Motaki 24.04.2020 um 09:38:09 Uhr
Goto Top
Robocopy gibt aus:

-Ungültiger Parameter #1 d:\Test\gw*
-Ungültiger Parameter #1 d:\Test\*

die weiteren Befehle sind ja damit hinfällig.


Ich kann doch nicht der einzige sein, der Ordner in einem Verzeichnis trennen will? face-smile
Motaki
Motaki 24.04.2020 aktualisiert um 10:15:22 Uhr
Goto Top
Ich habe die Lösung!

xcopy D:\Produkte D:\Arbeit /E /D /Y
for /f "tokens=*" %%a in ('dir D:\Arbeit\GW* /ad /b') do (  

robocopy /S /E /MOVE "D:\Arbeit\%%a" "D:\Arbeit2\GW\%%a"  
)
robocopy /S /E /MOVE D:\Arbeit\ D:\Arbeit2\NW\

Dieser trennt mir die GW Produkte von den normalen, in den beiden Ordnern kann ich dann weiter arbeiten, bzw. gehe ich statt in Arbeit2 direkt ins Archiv...

Geht sicher auch mit der Powershell, wenn ich wieder bissl Zeit habe, schau ich mir das auf jeden Fall an, ist mir im Moment zu komplex.