xandero
Goto Top

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.

@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

Content-Key: 265204

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

Printed on: April 16, 2024 at 06:04 o'clock

Member: TlBERlUS
TlBERlUS Mar 04, 2015 at 12:34:54 (UTC)
Goto Top
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
Mitglied: 114757
114757 Mar 04, 2015 updated at 13:14:20 (UTC)
Goto Top
Mit Powershell so z.B.
$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
}
Gruß jodel32
Member: Xandero
Xandero Mar 04, 2015 at 13:12:21 (UTC)
Goto Top
Hallo Tiberius,

danke dir für deine schnelle Antwort, aber ob das Skript nun lang oder kurz ist, ist für mich nicht so wichtig. Ich würde aber gern verstehen, wie das funktioniert was ich schreibe, und das was du da geschrieben hast versteh ich leider gar nicht. Ich würde mich freuen wenn du das etwas anpassen könntest, vielleicht versteh ich das ja dann.^^

Nochmals danke und Gruß,
Xandero
Member: Xandero
Xandero Mar 04, 2015 at 13:16:52 (UTC)
Goto Top
Hallo jodel32,

auch dir vielen Dank für die schnelle Antwort, doch genau wie ich grad Tiberius schrieb, versteh ich von deinem Code kein Stück und kann dementsprechend nichts anpassen um es zu testen, geschweige denn, dass ich kapieren würde wie es funktioniert.

Danke aber trotzdem für deine Bemühungen.

Gibt es vielleicht doch die Möglichkeit meinen selbst geschriebenen Code so anzupassen, dass er tut was ich möchte?

Gruß Xandero
Mitglied: 114757
Solution 114757 Mar 04, 2015 updated at 13:38:36 (UTC)
Goto Top
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!\"  
    )
)
Member: Xandero
Xandero Mar 04, 2015 at 13:39:33 (UTC)
Goto Top
Vielen Dank.

Hat super funktioniert. Und da steige ich auch mehr oder weniger durch.^^

Gruß Xandero
Mitglied: 114757
114757 Mar 04, 2015 updated at 13:42:44 (UTC)
Goto Top
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!
Member: TlBERlUS
TlBERlUS Mar 04, 2015 updated at 13:48:34 (UTC)
Goto Top
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){
  1. liest das Erstellungsyahr der Datei aus
$year = Get-ChildItem $path\$a | select -ExpandProperty Creationtime | select -ExpandProperty Year

#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
Member: TlBERlUS
TlBERlUS Mar 04, 2015 updated at 13:47:44 (UTC)
Goto Top
Zitat von @114757:

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!

Ganz tot ist Batch aber noch nicht, zumindestens in XP-Umgebungen face-smile
Mitglied: 114757
114757 Mar 04, 2015 at 13:53:15 (UTC)
Goto Top
Selbst in XP lässt sich PS nachrüsten face-wink
Na egal, jeder wie er's will ....
Member: Xandero
Xandero Mar 06, 2015 at 16:28:23 (UTC)
Goto Top
Die beiden Pfade habe ich angepasst, aber es hat nicht funktioniert, deswegen habe ich vermutet, das ich noch etwas anderes hätte ändern müssen...
Ich beschäftige mich mit Batch, da ich auf der arbeit häufiger damit in Kontakt komme, also macht es für mich Sinn, mich damit zumindest einigermaßen auszukennen.

Auf jeden Fall hat es geklappt und ich kann es gut gebrauchen.

Gruß Xandero