.bat/.cmd Datei zum Verschieben von Dateien unter Voraussetzungen

BenoitM

Cadet 3rd Year
Registriert
März 2012
Beiträge
44
HelloWorld,

ich möchte eine .bat/.cmd Datei erstellen, die es mir ermöglicht Dateien unter Vorraussetzung bestimmter Parameter zu verschieben oder zu kopieren.

Der Sachverhalt sieht wie folgt aus:

In einem Ordner "Datei01_01"
befinden sich eine beliebige Anzahl Dateien *.txt

Diese sollen zu 100MB Packeten in neue Ordner kopiert werden, wobei die benennung der neuen Ordner nach folgendem Schema erfolgen soll:

Datei01_01_001 ;wenn 100MB erreicht in den nächsten Ordner
Datei01_01_002 ;wenn 100MB erreicht in den nächsten Ordner
Datei01_01_003

usw.

Könnt ihr mir helfen? Gibt es eine alternative Lösung per fertigem Programm?
 
Ich weiß nicht, ob dir das ausreicht, aber du kannst die Dateien ja mit Winrar z.B. zu Paketen packen und dann ein Script darüberlaufen lassen, welches je nach Dateiname einen Ordner erzeugt und die Datei dahin schiebt.
 
Möglich ist das auf jeden Fall.
Du lässt den Ordner erstellen und solange befüllen wie die Ordergröße < 100MB ist.
Danach wird der nächste Ordner erstellt, usw...
Hier wird dir geholfen..., ne komplette Lösung dafür wird dir hier wohl niemand posten, machs selber und frag nach wenn du bestimmte Probleme hast - dann lernste auch was dabei ;).
 
Einmal in Powershell, bitteschön. ;)
Code:
$path = "c:\xyz\test"
$list = gci -path $path | ? {$_.extension -eq ".txt"}
$max = 104857600 # 100MB

$sum = ($list |  measure-object -property length -sum).sum # Summe der Dateigrößen
$runs = 0 

while ($sum -gt $max)
{
    $count = 1       # Zähler
    while (($list |select -first $count | measure-object length -sum).sum -lt $max){    # zählt benötigte Dateien für Dateigröße $max
        $count++
    }
    $runs++
    $folder = "\Datei01_01_00" + $runs +"\"
    new-item ($path + $folder) -type directory
    $list |select -first $count | move -destination ($path + $folder)
    
    # lese Ordner neu ein
    $list = gci -path $path | ? {$_.extension -eq ".txt"}
    $sum = ($list |  measure-object -property length -sum).sum

    
}
if(!($sum -gt $max)){
    echo "zu wenig Dateien / Skript beendet"
}
 
Zuletzt bearbeitet:
Super, danke für die Mühe!
Wie genau kann ich diesen ps script verwenden, also den Befehl tatsächlich ausführen..?
 
Dazu steckst du das ganze in eine txt Datei und benennst die Endung in .ps1 um.
Dann öffnest du die Powershell (einfach in die Suche eintippen) und erlaubst dort das Ausführen von lokalen Skripten, indem du
Code:
Set-ExecutionPolicy RemoteSigned
setzt.

Solltest du noch WinXP verwenden, musst du zuvor natürlich die Powershell noch installieren, ist erst ab Win Vista an Board.
 
real_general schrieb:
Dazu steckst du das ganze in eine txt Datei und benennst die Endung in .ps1 um.
Dann öffnest du die Powershell (einfach in die Suche eintippen) und erlaubst dort das Ausführen von lokalen Skripten, indem du
Code:
Set-ExecutionPolicy RemoteSigned
setzt.

Solltest du noch WinXP verwenden, musst du zuvor natürlich die Powershell noch installieren, ist erst ab Win Vista an Board.
Habe ich alles gemacht, beim Öffnen der .ps1 Datei poppt aber lediglich die editor Version der Datei auf.
Ergänzung ()

Brinox schrieb:
Ich weiß nicht, ob dir das ausreicht, aber du kannst die Dateien ja mit Winrar z.B. zu Paketen packen und dann ein Script darüberlaufen lassen, welches je nach Dateiname einen Ordner erzeugt und die Datei dahin schiebt.
Funktioniert leider nicht.
Ergänzung ()

Labtec schrieb:
Möglich ist das auf jeden Fall.
Du lässt den Ordner erstellen und solange befüllen wie die Ordergröße < 100MB ist.
Danach wird der nächste Ordner erstellt, usw...
Hier wird dir geholfen..., ne komplette Lösung dafür wird dir hier wohl niemand posten, machs selber und frag nach wenn du bestimmte Probleme hast - dann lernste auch was dabei ;).

Mein Ansatz hierzu wäre robocopy gewesen. Mir ist hierbei aber unklar, wie ich die Parameter der fortlaufenden Dateibenennung sowie die Abfrage und Verwendung der Speichermenge des Ordners integriere.
 
Das Script funktioniert sehr gut, möglicherweise muss du Pfad anpassen...
 
Zuletzt bearbeitet:
Entilzha schrieb:
Das Script funktioniert sehr gut, möglicherweise muss du Pfade anpassen...

In der .ps1 Datei habe ich die Pfade angepasst.
Verwende Win 7. Die Datei wurde auch tatsächlich in eine Powershell Datei umgewandelt (icon geändert).
Beim Ausführen der Datei öffnet sich leider nur der Editor mit dem Text.


$path = "H:\Dateipfad\InDemDieDateienLiegen"
$list = gci -path $path | ? {$_.extension -eq ".txt"}
$max = 104857600 # 100MB

$sum = ($list | measure-object -property length -sum).sum # Summe der Dateigrößen
$runs = 0

while ($sum -gt $max)
{
$count = 1 # Zähler
while (($list |select -first $count | measure-object length -sum).sum -lt $max){ # zählt benötigte Dateien für Dateigröße $max
$count++
}
$runs++
$folder = ""H:\Dateipfad\WoDieDateienHinSollen\Datei01_01_00" + $runs +"\"
new-item ($path + $folder) -type directory
$list |select -first $count | move -destination ($path + $folder)
# lese Ordner neu ein
$list = gci -path $path | ? {$_.extension -eq ".txt"}
$sum = ($list | measure-object -property length -sum).sum

}
if(!($sum -gt $max)){
echo "zu wenig Dateien / Skript beendet"
}


Soll in Zeile 15 nur
$folder = "\Datei01_01_00" + $runs +"\"
stehen?
Habe hier den kompletten Pfad angegeben.
 
Zuletzt bearbeitet:
Rechtsklick, "mit powershell ausführen". Oder via cmd "powershell.exe ./skript.ps1".

Die Zeile sollte da unverändert stehen bleiben, nur oben muss einmal angepasst werden.
 
Funktioniert!
Wieder was gelernt.. :)

Beste Grüße
Ergänzung ()

Habe jetzt leider das Problem, dass die restlichen Dateien (echo "zu wenig Dateien / Skript beendet") offen liegen bleiben.
Diese Dateien sollten auch noch in einen Ordner; in den fortlaufend letzten.
 
Kein Problem:

-edit- er spuckt grad noch nen Fehler aus, Moment.
-edit2- jetzt aber!

Code:
$path = "c:\path"
$list = gci -path $path | ? {$_.extension -eq ".txt"}
$max = 104857600 # 100MB

$sum = ($list |  measure-object -property length -sum).sum # Summe der Dateigrößen
$runs = 0 

while ($sum -gt $max)
{
    $count = 1       # Zähler
    while (($list |select -first $count | measure-object length -sum).sum -lt $max){    # zählt benötigte Dateien für Dateigröße $max
        $count++
    }
    $runs++
   $folder = "\Datei01_01_" +"{0:D3}" -f $runs +"\"
    new-item ($path + $folder) -type directory
    $list |select -first $count | move -destination ($path + $folder)
    
    # lese Ordner neu ein
    $list = gci -path $path | ? {$_.extension -eq ".txt"}
    $sum = ($list |  measure-object -property length -sum).sum

    
}
if(!($sum -gt $max)){
    # verschiebt restliche Dateien
    if($runs -gt 0 -and ($list |  measure-object).count -ne 0){   # wenn $list nicht leer
        $list | move -destination ($path + $folder)
    }
    
    echo "zu wenig Dateien / Skript beendet"
}
 
Zuletzt bearbeitet:
Funktioniert wunderbar.

Richtig schön wäre es, wenn die Benennung der erstellten Ordner nach den ersten 19 Stellen der Dateinamen erfolgt (die ersten 19 stellen sind bei allen Dateien die verschoben werden sollen statisch) und die count Funktion eine fixe Länge hat.

Im Moment sieht die Bennenung so aus:

Datei_01
.
.
Datei_012
.
.
Datei_0456

usw.

gewünscht wäre:

Datei_0001
.
.
Datei_0234
.
.
Datei_9999

Geht das? Wo müsste man hier was einfügen/bearbeiten?
 
Die Benennung hab ich schnell mal oben reingemacht. Was du mit dem anderen Teil meinst, ist mir aber nicht so ganz klar. :freaky:
 
Zuletzt bearbeitet:
Sehr stark!

Mit dem anderen Teil meinte ich, dass der counter der Dateibenennung statisch 4 Zeichen lang sein sollte. Im moment variiert diese Länge eben je nach Anzahl des Ordners.
 
Dann änderst du einfach die 3 in
Code:

{0:D3}

in eine 4.

Ah ok, der andere Teil war gemeint.

Die Ordnerbenennung erfolgt nach derzeitigem script nach dem Schema

"\Datei01_01_" +"{0:D4}"


Diese hätte ich jedoch gerne dynamisch, bezogen auf die ersten 19 Stellen des Dateinamens, der zu verschiebenden Dateien.
Die zu verschiebenden Dateien sind immer nach einem bestimmten Schema aufgebaut, nach welcher sich die Ordnerbenennung richten soll.

Zu verschiebenden Dateien:

Dateiname(19Stellig)_counter_0001
Dateiname(19Stellig)_counter_0002
Dateiname(19Stellig)_counter_0003
.
.

Gewünschte Ordnerbenennung:

"Dateiname(19Stellig)_" +"{0:D4}"
 
Eigentlich sollte auch das kein Problem sein. Die Frage ist nur, was passieren soll, wenn in einem Ordner Dateien mit verschiedenen "Namen" landen!?
 
Die ersten 19 Stellen sind bei allen Dateien innerhalb dieses Ordners immer gleich.
 

Ähnliche Themen

Zurück
Oben