bad1hor
Goto Top

Dateien suchen, kopieren und sortieren

Hallo,

folgendes Problem:

Dateien, die auf einem Laufwerk monatsweise in Ordnern abgelegt sind, sollen per Batch auf ein anderes Laufwerk kopiert werden und gleichzeitig nicht nach Monate, sondern nach Benennung einsortiert werden. Dabei kann es auch vorkommen, dass gleich benannte Dateien in mehreren Ordner vorkommen.

Iststand:
- Ordner
..\2015_07\
..\2015_06\
...
..\2003_07\

- Dateien
..\2015_07\1.MES
..\2015_07\12.MES
...
..\2015_07\12345678.MES


Soll:
- Ordner
..\00000000-00009999\
..\00010000-00019999\
...
..\34990000-34999999\

Kann mir da jemand helfen, oder ist das für eine Batch zu kompliziert? Bin ein Neuling auf dem Gebiet...

MfG BAD1HOR

Content-Key: 286439

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

Printed on: April 25, 2024 at 20:04 o'clock

Mitglied: 114757
114757 Oct 26, 2015, updated at Oct 30, 2015 at 10:37:12 (UTC)
Goto Top
Moin BAD1HOR,
vielleicht solltest du deine Beschreibung etwas klarer machen, vermutlich hat deswegen noch keiner geantwortet. Habe es mal versucht zu interpretieren,
hier eine Lösung mit Powershell.
#Quellordner
$source = 'c:\quelleroot'  
# Zielordner
$target = 'C:\zielroot'  
# Logfile
$logfile = 'C:\logfile.txt  
$cnt = 0
# Für alle Dateien des Quellordners inkl. Unterordner welche nur aus Zahlen bestehen ...
gci $source -recurse | ?{!$_.PSIsContainer -and $_.Basename -match '^\d+$'} | %{  
    # Ordnername generieren (10000er Sätze)
    $lowerbound = [math]::Floor(([decimal]$_.BaseName / 10000)) * 10000
    $newfolder = $target + "\" + $lowerbound.toString().PadLeft(10,'0') + "-" + ($lowerbound + 9999).toString().padLeft(10,'0')  
    # Ordner erstellen falls er noch nicht existiert
    if (!(Test-Path $newfolder)){md $newfolder -Force | out-null}
    $fname = $_.Name; $cnt = 1
    # auf Duplikate checken und bei Bedarf eine zusätzliche Nummer (x) anhängen
    while((Test-Path "$newfolder\$fname")){  
        $fname = "$($_.Basename)($cnt)$($_.Extension)"; $cnt++  
    }
    # Datei in Zielordner kopieren
    copy $_.FullName "$newfolder\$fname" -Verbose  
    $cnt++
}
# Write Log
@"  
$(get-date -F g) / Computer: $env:COMPUTERNAME / Anzahl kopierter Dateien: $($cnt)
--------------
"@ | Add-Content -Path $logfile  
Gruß jodel32
Member: BAD1HOR
BAD1HOR Oct 29, 2015 at 08:52:38 (UTC)
Goto Top
Hallo jodel32,

vielen Dank, hat super funktioniert. Ich hab noch zwei Fragen.

1. Ist es auch möglich, in der Powershell die kopierten Dateien anzuzeigen, und die erstellten Ordner nicht anzeigen?

2. Wie kann ich dazu noch ein LogFile schreiben?
Log soll enthalten:
- Datum mit Zeit
- Rechnername
- Anzahl kopierte Dateien

Gruß BAD1HOR
Mitglied: 114757
114757 Oct 29, 2015 at 11:03:40 (UTC)
Goto Top
Zitat von @BAD1HOR:
1. Ist es auch möglich, in der Powershell die kopierten Dateien anzuzeigen, und die erstellten Ordner nicht anzeigen?

2. Wie kann ich dazu noch ein LogFile schreiben?
Log soll enthalten:
- Datum mit Zeit
- Rechnername
- Anzahl kopierte Dateien
Alles oben ergänzt ..

Gruß jodel32
Member: BAD1HOR
BAD1HOR Oct 30, 2015 at 08:55:10 (UTC)
Goto Top
Hallo jodel32,

hat fast funktioniert. Das zählen in der LogFile geht nicht. Bei $(cnt) kam eine Fehlermeldung das cnt nicht definiert wäre, dann habe ich daraus $($cnt) gemacht, wurde dann aber falsch gezählt.

Außerdem brauche ich noch 2 Erweiterungen.

1. Das LogFile soll immer geschrieben werden, auch wenn z.B. ein Abbruch vom Benutzer erfolgt. Außerdem soll noch der Windows-User mit rein.

2. Kann der Check auf gleich benannte Dateien auch so geschrieben werden, dass nur Dateien mit anderen Eigenschaften kopiert werden, und die die gleich sind, sprich gleiche Benennung und gleiches Erstelldatum nicht?

z.B. so nicht kopieren
1759189.MES 08.01.2015 15:16
1759189(1).MES 08.01.2015 15:16

z.B. so kopieren
1759189(1).MES 18.06.2015 12:51

Gruß BAD1HOR
Mitglied: 114757
114757 Oct 30, 2015 at 10:37:59 (UTC)
Goto Top
Zitat von @BAD1HOR:

Hallo jodel32,

hat fast funktioniert. Das zählen in der LogFile geht nicht. Bei $(cnt) kam eine Fehlermeldung das cnt nicht definiert wäre, dann habe ich daraus $($cnt) gemacht, wurde dann aber falsch gezählt.
Fehler korrigiert (Dollarzeichen vor der Variablen vergessen...
Außerdem brauche ich noch 2 Erweiterungen.
Gegen Entgeld gerne....

Gruß jodel32
Member: BAD1HOR
BAD1HOR Nov 05, 2015 at 09:54:19 (UTC)
Goto Top
Hallo jodel32,

wäre es nicht möglich, dass Sie mir nochmal helfen können bei den Erweiterungen?

Das mit dem zählen in der LogFile funktioniert auch noch nicht richtig. In der LogFile steht, dass 2 Dateien kopiert worden sind, es sind aber 5.106 Dateien sein.

Gruß BAD1HOR