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:
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
Please also mark the comments that contributed to the solution of the article
Content-ID: 668271
Url: https://administrator.de/contentid/668271
Printed on: December 10, 2024 at 15:12 o'clock
18 Comments
Latest comment
muss es batch sein ?
hier in powershell:
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
}
Powershell Einzeiler
Plain Batch
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\"
)
)
Logisch, kein Problem.
Hab dir aber noch ne Batch ergänzt falls du noch Berührungsängste vor der PowerShell hast.
Hab dir aber noch ne Batch ergänzt falls du noch Berührungsängste vor der PowerShell hast.
bash != batch
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 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
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 schwierigansonsten:
$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
}
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.
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!
Doch klappt hier im Test einwandfrei. Hast es wohl falsch angepasst/kopiert.
RTFM!
Tutorial zur FOR-Schleife
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
Zitat von @Test12121:
Es wurden aber auch keine Dateien verschoben.
Wie führt man denn eine Powershell aus? Mit Powershell habe ich noch nie gearbeitet
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"