test12121
Goto Top

Batch - Dateien aus Ordnerstruktur verschieben

Hallo zusammen,

ich möchte mithilfe einer Batch Datei Dateien aus einer Ordnerstruktur in einen Zielordner verschieben. Die Ordnerstruktur ist nach folgendem Schema aufgebaut:

C:\Users\user\Desktop\batch\Projekte\xxxx\Ergebnisse\yyyy\zzzz\.txt

Also im Ordner "Projekte" sind mehrere Ordner hinterlegt. In jedem "xxxx" Ordner sind einige Ordner und Dateien abgelegt. Interessant ist für die Aufgabe allerdings nur der Ordner "Ergebnisse". In diesem Ordner gibt es 2 Ebenen an Unterverzeichnissen. In den Unterordnern "zzzz" sind dann die .txt Dateien abgelegt, die in den Zielpfad verschoben werden sollen.

Perfekt wäre es wenn dazu noch im Zielpfad die Projekt-Ordner automatisch erstellt werden falls noch kein Ordner vorhanden ist.
Also das im unteren Beispiel der "xxx" Ordner automatisch erstellt wird und dort auch nur die Dateien aus dem Projekt "xxxx" landen.

C:\Users\user\Desktop\batch\Ziel\xxx\

Ich habe bereits in Foren geguckt, aber konnte mir das Skript bisher noch nicht zusammenbauen, da ich auch nicht viel Erfahrung habe. Mein bisheriges Skript sieht wie folgt aus:

@ECHO OFF

FOR /F %%i IN ('dir /ad /b C:\Users\user\Desktop\batch\Projekte') DO   
FOR /F %%j IN ('dir /ad /b C:\Users\user\Desktop\batch\Projekte\%%i\Ergebnisse /s') DO   
	
	if exist C:\Users\user\Desktop\batch\Ziel\%%i
		move C:\Users\user\Desktop\batch\Projekte\%%i\Ergebnisse\%%j\*.txt C:\Users\user\Desktop\batch\Ziel\%%i
	else
		md C:\Users\user\Desktop\batch\Ziel\%%i
		move C:\Users\user\Desktop\batch\Projekte\%%i\Ergebnisse\%%j\*.txt C:\Users\user\Desktop\batch\Ziel\%%i
	end 

Content-ID: 668271

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

Ausgedruckt am: 26.09.2024 um 23:09 Uhr

pebcak7123
pebcak7123 20.09.2024 aktualisiert um 08:51:49 Uhr
Goto Top
muss es batch sein ?
hier in powershell:
$sourcepath = "c:\Projekte\"  
$destinationPath = "C:\batch\Ziel"  
Get-ChildItem -Path $sourcePath  | Where-Object { $_.PSIsContainer } | ForEach-Object { 
 $projectName = $_.Name
 $destinationProjectPath = Join-Path $destinationPath $projectName
if (!(Test-Path $destinationProjectPath)) {
        New-Item -ItemType Directory -Path $destinationProjectPath -force | out-null
    }
$resultsPath = Join-Path $sourcePath $projectName "\Ergebnisse\yyyy\zzzz"  
Get-ChildItem -Path $resultsPath -Recurse -Filter "*.txt" |    Move-Item -Destination $destinationProjectPath -force  
}
Ted555
Lösung Ted555 20.09.2024 aktualisiert um 10:31:42 Uhr
Goto Top
Powershell Einzeiler
Get-ChildItem -Path "C:\Users\user\Desktop\batch\Projekte" -Directory -Recurse -PipelineVariable dir | %{Get-ChildItem "$($_.Fullname)\Ergebnisse" -File -Recurse -Filter *.txt | move-item -Destination {(New-Item -Type Dir -Path "C:\Users\user\Desktop\batch\Ziel\$($dir.Name)" -force).Fullname} -Verbose}  

Plain Batch
@echo off
set "Quelle=C:\Users\user\Desktop\batch\Projekte"  
set "Ziel=C:\Users\user\Desktop\batch\Ziel"  

for /d %%a in ("%quelle%\*") do (  
    if not exist "%ziel%\%%~nxa" md "%ziel%\%%~nxa" >nul  
    for /f "delims=" %%b in ('dir /b /s /a-d "%%a\Ergebnisse\*.txt"') do (  
        move "%%b" "%ziel%\%%~nxa\"  
    )
)
Test12121
Test12121 20.09.2024 um 09:31:01 Uhr
Goto Top
Hi,
das Skript soll später mit Hilfe der Windows Aufgabenplanung täglich ausgeführt werden. Ist das mit Powershell auch möglich? Kenne mich damit nicht aus.
Ted555
Ted555 20.09.2024 aktualisiert um 09:35:16 Uhr
Goto Top
Logisch, kein Problem.

Hab dir aber noch ne Batch ergänzt falls du noch Berührungsängste vor der PowerShell hast.
pebcak7123
pebcak7123 20.09.2024 um 09:35:42 Uhr
Goto Top
natürlich ist das genauso möglich wie mit bash, würde dann aber noch logging einbauen.
stacktrace
stacktrace 20.09.2024 um 09:39:30 Uhr
Goto Top
bash != batch
Test12121
Test12121 20.09.2024 um 09:39:53 Uhr
Goto Top
Zitat von @Ted555:

Plain Batch
@echo off
set "Quelle=C:\Users\user\Desktop\batch\Projekte"  
set "Ziel=C:\Users\user\Desktop\batch\Ziel"  

for /d %%a in ("%quelle%") do (  
    for %%b in ("%%a\Ergebnisse\yyyy\zzzz\*.txt") do (  
        if not exist "%ziel%\%%~nxa" md "%ziel%\%%~nxa" >nul  
        move "%%b" "%ziel%\%%~nxa\"  
    )
)

@Ted555
Danke für die Antwort!

Es funktioniert noch nicht. Es taucht nur kurz ein cmd Fesnter auf und schließt sich direkt wieder.

Es gibt übrigens nicht nur "yyy" und "zzz" als Unterordner sondern es können beliebig viele sein, genauso wie es bei "xxx" der Fall ist
Test12121
Test12121 20.09.2024 um 09:43:21 Uhr
Goto Top
Sind die Anführungszeichen bei den Set Befehlen richtig gesetzt?
pebcak7123
pebcak7123 20.09.2024 um 09:45:29 Uhr
Goto Top
Zitat von @Test12121:

Es funktioniert noch nicht. Es taucht nur kurz ein cmd Fesnter auf und schließt sich direkt wieder.
warum sollte es auch offen bleiben ?
Es gibt übrigens nicht nur "yyy" und "zzz" als Unterordner sondern es können beliebig viele sein, genauso wie es bei >"xxx" der Fall ist
Das wäre ne gute info für den eingangspost gewesen, gibts denn auch andere txt dateien in unterordnern die nicht verschoben werden sollen ? Dann wirds schwierig
ansonsten:
$sourcepath = "c:\Projekte\"  
$destinationPath = "C:\batch\Ziel"  
Get-ChildItem -Path $sourcePath  | Where-Object { $_.PSIsContainer } | ForEach-Object { 
 $projectName = $_.Name
 $destinationProjectPath = Join-Path $destinationPath $projectName
if (!(Test-Path $destinationProjectPath)) {
        New-Item -ItemType Directory -Path $destinationProjectPath -force  | out-null
    }
$resultsPath = Join-Path $sourcePath $projectName "\Ergebnisse"  
Get-ChildItem -Path $resultsPath -Recurse -Filter "*.txt" |    Move-Item -Destination $destinationProjectPath -force  
}
Test12121
Test12121 20.09.2024 um 09:45:55 Uhr
Goto Top
Also zum Verständnis:
Es sollen alle Textdateien die im Ergebnisse-Ordner liegen verschoben werden. Auch alle Dateien die in irgendwelchen Unterordnern liegen.
Test12121
Test12121 20.09.2024 um 09:53:06 Uhr
Goto Top
Zitat von @pebcak7123:

warum sollte es auch offen bleiben ?
Es wurden aber auch keine Dateien verschoben.

Wie führt man denn eine Powershell aus? Mit Powershell habe ich noch nie gearbeitet
Ted555
Ted555 20.09.2024 aktualisiert um 09:54:24 Uhr
Goto Top
Zitat von @Test12121:

Also zum Verständnis:
Es sollen alle Textdateien die im Ergebnisse-Ordner liegen verschoben werden. Auch alle Dateien die in irgendwelchen Unterordnern liegen.

Das hätte man direkt in den Eingangspost schreiben sollen ...
Ist oben angepasst...

Sind die Anführungszeichen bei den Set Befehlen richtig gesetzt?
Ja definitiv, das ist richtig, macht man so und nicht anders!
Test12121
Test12121 20.09.2024 um 10:02:07 Uhr
Goto Top
Zitat von @Ted555:

Das hätte man direkt in den Eingangspost schreiben sollen ...
Ist oben angepasst...

Danke. Es funktioniert leider noch nicht. Kann ich irgendwie die Fehler auslesen? Wüsste jetzt nämlich nicht wie ich euch sagen soll, woran es liegt.
Test12121
Test12121 20.09.2024 um 10:19:53 Uhr
Goto Top
Okay in cmd wird folgender Fehler aufgeführt:

Die Datei "'dir /b /s /a-d ""C:\Users\user\Desktop\batch\Projekte"\Ergebnisse\*.txt"" kann nicht gefunden werden.

Das Anführungszeichen hinter Projekte kommt mir etwas komisch vor.
Test12121
Test12121 20.09.2024 um 10:22:15 Uhr
Goto Top
Beziehungsweise es fehlt noch die Dateiebene "xxx" zwischen Projekte und Ergebnisse
Ted555
Ted555 20.09.2024 aktualisiert um 10:46:09 Uhr
Goto Top
Doch klappt hier im Test einwandfrei. Hast es wohl falsch angepasst/kopiert.
Beziehungsweise es fehlt noch die Dateiebene "xxx" zwischen Projekte und Ergebnisse
Nein fehlt nicht, diese Ordner werden mit der ersten For-/d-Schleife verarbeitet und in der Variablen %%a hinterlegt.

Das Anführungszeichen hinter Projekte kommt mir etwas komisch vor.
Nein! Das ist vollkommen normal bei einer For /f Schleife mit Kommando das sind single quotes und das muss so!

RTFM!
Tutorial zur FOR-Schleife
pebcak7123
pebcak7123 20.09.2024 um 10:32:56 Uhr
Goto Top
Zitat von @Test12121:

Zitat von @pebcak7123:

warum sollte es auch offen bleiben ?
Es wurden aber auch keine Dateien verschoben.

Wie führt man denn eine Powershell aus? Mit Powershell habe ich noch nie gearbeitet

als ps1 datei speichern und dann
powershell.exe "C:\verzeichnis\datei.ps1"  
in der kommandozeile
Test12121
Test12121 20.09.2024 um 10:51:40 Uhr
Goto Top
@Ted555 Danke, es funktioniert jetzt! Habe es nochmal neu kopiert und engepasst. Habe irgendwo einen kleinen Fehler drin gehabt.

Danke euch beiden für die Mühe!