Batch: Dateien automatisch in verschiedene Ordner sortieren
Hallo Community,
ich möchte folgende Aufgabe per Batch lösen:
In einem Ordner werden täglich mehrere csv-Dateien angelegt, die nach Jahr und Monat getrennt in Ordner abgelegt werden sollen. Da hat sich aber schon lange niemand mehr drum gekümmert, sodass ich nun damit beauftragt wurde, da etwas Ordnung zu schaffen. Da ich in Batch noch nicht so viel Erfahrung habe, dachte ich mir das wär eine schöne Aufgabe um etwas zu lernen doch habe ich trotz stundenlanger Recherche keine funktionierende Datei schreiben können.
Der Dateiname ist wie folgt aufgebaut "ABCDEFGHI.12345.JJJJMMTT.12345.csv". Ich habe schon versucht diesen vorn und hinten zu kürzen, den Rest als Variable zu speichern und diese dann mit einem Wert zu vergleichen, aber bei mir kommt immer nur Quatsch dabei raus. Ich vermute, dass meine for-Schleife nicht richtig war und deshalb keine Variable gespeichert wurde.
Soweit ich konnte hab ich mal was geschrieben, aber ob man das so gebrauchen kann weis ich leider nicht. Vielleicht könnt ihr was damit anfangen.
Hoffentlich versteht ihr was ich versucht habe und könnt mir helfen dies umzusetzen. Wenn ihr Fragen habt, immer her damit.
Danke schon mal für eure Hilfe.
Gruß Xandero
ich möchte folgende Aufgabe per Batch lösen:
In einem Ordner werden täglich mehrere csv-Dateien angelegt, die nach Jahr und Monat getrennt in Ordner abgelegt werden sollen. Da hat sich aber schon lange niemand mehr drum gekümmert, sodass ich nun damit beauftragt wurde, da etwas Ordnung zu schaffen. Da ich in Batch noch nicht so viel Erfahrung habe, dachte ich mir das wär eine schöne Aufgabe um etwas zu lernen doch habe ich trotz stundenlanger Recherche keine funktionierende Datei schreiben können.
Der Dateiname ist wie folgt aufgebaut "ABCDEFGHI.12345.JJJJMMTT.12345.csv". Ich habe schon versucht diesen vorn und hinten zu kürzen, den Rest als Variable zu speichern und diese dann mit einem Wert zu vergleichen, aber bei mir kommt immer nur Quatsch dabei raus. Ich vermute, dass meine for-Schleife nicht richtig war und deshalb keine Variable gespeichert wurde.
Soweit ich konnte hab ich mal was geschrieben, aber ob man das so gebrauchen kann weis ich leider nicht. Vielleicht könnt ihr was damit anfangen.
@echo off
für alle *.*.*.*.csv in "f:\test\" do (
setze a = datums-abschnitt aus Dateiname
if %a% GEQ 20151201 do (
if exist "f:\test\ordner1" do (
move "f:\test\%a%" "f:\test\order1"
) else (
md "f:\test\ordner1"
move "f:\test\%a% f:\test\ordner1"
)
) else (
if %a% GEQ 20151101 do (
if exist "f:\test\ordner2" do (
move "f:\test\%a%" "f:\test\order2"
) else (
md "f:\test\ordner2"
move "f:\test\%a% f:\test\ordner2"
)
) else (
if %a% GEQ 20151001 do (
if exist "f:\test\ordner3" do (
move "f:\test\%a%" "f:\test\order3"
) else (
md "f:\test\ordner3"
move "f:\test\%a% f:\test\ordner3"
)
) else (
.
.
.
)
pause
exit
Hoffentlich versteht ihr was ich versucht habe und könnt mir helfen dies umzusetzen. Wenn ihr Fragen habt, immer her damit.
Danke schon mal für eure Hilfe.
Gruß Xandero
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 265204
Url: https://administrator.de/forum/batch-dateien-automatisch-in-verschiedene-ordner-sortieren-265204.html
Ausgedruckt am: 24.12.2024 um 01:12 Uhr
11 Kommentare
Neuester Kommentar
Hi,
ich würde dir empfehlen, das ganze mit der Powershell zu lösen.
Die Syntax ist imho einfacher und das Skript dürfte kürzer werden.
<code/>switch ($decide){
1 {
$array = Get-ChildItem $path -recurse -Include *.$file | select -expand name
for ($a=0; $a -lt $array.Length; $a++){
if($array[$a].length -ge $length+4){
$array[$a] | out-file C:\Wartung\$time.log.xls -append}
}
}
2{
$array = Get-ChildItem -Recurse -Include *.$file | select -expand fullname
for ($a=0; $a -lt $array.Length; $a++){
if($array[$a].length -ge 1+4){
$array[$a] | out-file C:\Wartung\$time.log2.xls -append}
}
}
}
Write-Host "Vorgang abgeschlossen, das Log befindet sich unter C:\Wartung" -foregroundcolor "green"
Das ist ein Skript, welches Dateien mit einer bestimmten Länge ausliest und in ein Log schreibt.
Vllt. hilft dir das etwas weiter.
Wenn ich heute Nachmittag Zeit habe, sehe ich mal, ob ich noch was passenderes schreiben kann.
Grüße,
Tiberius
ich würde dir empfehlen, das ganze mit der Powershell zu lösen.
Die Syntax ist imho einfacher und das Skript dürfte kürzer werden.
<code/>switch ($decide){
1 {
$array = Get-ChildItem $path -recurse -Include *.$file | select -expand name
for ($a=0; $a -lt $array.Length; $a++){
if($array[$a].length -ge $length+4){
$array[$a] | out-file C:\Wartung\$time.log.xls -append}
}
}
2{
$array = Get-ChildItem -Recurse -Include *.$file | select -expand fullname
for ($a=0; $a -lt $array.Length; $a++){
if($array[$a].length -ge 1+4){
$array[$a] | out-file C:\Wartung\$time.log2.xls -append}
}
}
}
Write-Host "Vorgang abgeschlossen, das Log befindet sich unter C:\Wartung" -foregroundcolor "green"
Das ist ein Skript, welches Dateien mit einer bestimmten Länge ausliest und in ein Log schreibt.
Vllt. hilft dir das etwas weiter.
Wenn ich heute Nachmittag Zeit habe, sehe ich mal, ob ich noch was passenderes schreiben kann.
Grüße,
Tiberius
Mit Powershell so z.B.
Gruß jodel32
$quelle = 'c:\quelle'
$ziel = 'c:\ziel'
gci $quelle -Filter "*.csv" | ?{$_.Basename -match '\d{5}\.(\d{4})(\d{2})(\d{2})\.\d{5}' } | %{
$target = "$ziel\$($matches[1])\$($matches[2])"
if (!(Test-Path $target)){md $target}
Move-Item $_.Fullname $target
}
Gibt es vielleicht doch die Möglichkeit meinen selbst geschriebenen Code so anzupassen, dass er tut was ich möchte?
Yep ... dann eben für die Batch-Leichen ....@echo off & setlocal enabledelayedexpansion
Set "Quelle=c:\Ordner"
Set "ziel=c:\Ziel"
for %%a in ("%quelle%\*.csv") Do @(
set "name=%%~na"
for /f "tokens=3 delims=." %%b in ("!name!") DO (
set "datestring=%%b"
set year=!datestring:~0,4!
set month=!datestring:~4,2!
set "target=%ziel%\!year!\!month!"
if not exist "!target!" md "!target!"
move "%%a" "!target!\"
)
)
Naja, beim Powershell-Script hättest du auch nur Quell- und Zielpfad anpassen müssen .... :-P
Batch ist tot, es lebe Powershell ...
Wer jetzt noch Batch lernt ist selber Schuld!
Batch ist tot, es lebe Powershell ...
Wer jetzt noch Batch lernt ist selber Schuld!
Ich hab mal was zusammengeschrieben(könnte noch etwas feinschliff vertragen , sollte aber funktionieren).
Habe zur Verständlichkeit Kommentare dazu geschrieben.
<code/>
#Quell-Verzeichnis
$path = "C:\test\Dateien
"
#Erstellung eines Arrays, gefüllt mit den Dateinamen
$array = @(Get-ChildItem $path -Recurse | select -ExpandProperty Name )
#foreach-Schleife, die die Ordner erstellt und die Dateien verschiebt
foreach($a in $array){
#liest den Erstellungsmonat der Datei aus
$month = Get-ChildItem $path\$a | select -ExpandProperty Creationtime | select -ExpandProperty month
#Ziel-Verzeichnis
$path2 = "C:\test\Ziel\$year\$month"
#Erstellung des Zielverzeichnisses
New-Item -Path $path2 -ItemType directory
#Verschieben der Dateien
Move-Item $path\$a $path2
}
Grüße,
Tiberius
Edit: zu spät
Habe zur Verständlichkeit Kommentare dazu geschrieben.
<code/>
#Quell-Verzeichnis
$path = "C:\test\Dateien
"
#Erstellung eines Arrays, gefüllt mit den Dateinamen
$array = @(Get-ChildItem $path -Recurse | select -ExpandProperty Name )
#foreach-Schleife, die die Ordner erstellt und die Dateien verschiebt
foreach($a in $array){
- liest das Erstellungsyahr der Datei aus
#liest den Erstellungsmonat der Datei aus
$month = Get-ChildItem $path\$a | select -ExpandProperty Creationtime | select -ExpandProperty month
#Ziel-Verzeichnis
$path2 = "C:\test\Ziel\$year\$month"
#Erstellung des Zielverzeichnisses
New-Item -Path $path2 -ItemType directory
#Verschieben der Dateien
Move-Item $path\$a $path2
}
Grüße,
Tiberius
Edit: zu spät
Selbst in XP lässt sich PS nachrüsten
Na egal, jeder wie er's will ....
Na egal, jeder wie er's will ....