medi2008
Goto Top

Dateinamen mit gleichem String in einen Ordner schieben, den Ordner nach String benennen

Einen Gruss an alle Forumser !

Nach vergeblicher Suche wende ich mich an euch mit meiner Frage.

Auf einem Windows-PC möchte ich einen Batch (Script.bat) laufen lassen, der mir folgendes erledigt:

Es gibt ein paar Hundert Dateien die allesamt solche Dateinamen haben:

M012014-09-19T101115.zip
M012014-09-20T105110.zip
M022014-09-19T111928.zip
M022014-10-20T113835.zip
M052014-10-19T130237.zip

  • Es gibt keine gleichen Dateinamen
  • aber in jedem der Dateinamen sind die Zeichen 4 – 13 immer das Datum
  • Alle Dateien mit den gleichen Zeichen (von 4 – 13 im Dateinamen) sollen in denselben Ordner verschoben werden
  • der Ordner muss erstellt werden
  • und der Ordner soll mit dem String benannt sein (Tagesdatum)

Also die Dateien
M012014-09-19T101115.zip
M022014-09-19T111928.zip
M052014-10-19T130237.zip

sollen in den Ordner
2014-09-19

die Dateien
M012014-09-20T105110.zip
M022014-10-20T113835.zip

sollen in den Ordner
2014-09-20

Die Namen der Dateien darf ich dabei nicht umbenennen.

Habe bislang nur rudimentäre Batch-Kenntnisse
Ich wäre euch sehr dankbar für Hilfe

Merci! und Grüsse

Content-Key: 313367

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

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

Mitglied: 129813
129813 Aug 23, 2016, updated at Aug 24, 2016 at 06:04:00 (UTC)
Goto Top
Member: pieh-ejdsch
pieh-ejdsch Aug 23, 2016, updated at Aug 25, 2016 at 15:37:38 (UTC)
Goto Top
Moin,

Um die Datenauswahl so gering wie möglich zu halten wird anstatt jede Datei anzuschauen nur der Relevante Datumteil einmalig extrahiert.
Um nur vorhandene Dateien eines Ortes zu dursuchen wird eine einfache Forschleife mit Platzhalter verwendet und verwertet.
Somit können auch Verschiebeaktionen mit Platzhaltern erfolgen.
Die Dateien werden pro gleichen Datum insgesamt verschoben.

@echo off
setlocal disabledelayedexpansion

 rem Einstellungen -------------
pushD "D:\TestverzeichnisMitTestdaten"  
set "DateiFilter=*-*-*.zip"  
set "OffsetDate=3,10"  

 rem Variable Test zeigt mit echo was es machen würde wenn die Variable nicht erstellt wird
 rem Wird die Variable Test [ set "Test=echo" ] mit dem Inhalt echo in dieser Batch erstellt,  
 rem dann erfolgt nur eine Simulation vom Erstellen der Ordner und dem Verschieben der Dateien
 rem --- Zum scharfstellen die Variable Test leer lassen [ set "Test=" ]  
set "Test=echo"  

 rem Ende Einstellungen ------

for %%i in ("%DateiFilter%") do (  
  set "Ordner=%%i"  
  setlocal enabledelayedexpansion
  for %%j in ("!Ordner:~%OffsetDate%!") do (  
    endlocal
    call;
    if not exist "%%~j\" %Test% md "%%~j"  
    if not errorlevel 1 ( echo(verschiebe nach %%~j :
    %Test% move "*%%~j*%%~xi" "%%~j\"  
) ) )
popD

Phil
Member: batchnewbie
batchnewbie Aug 24, 2016 at 10:55:38 (UTC)
Goto Top
Hi, oder als oneliner für die CMD Konsole:
cmd /v:on /c "for /f "delims=" %i in ('dir /b "*.zip"') do @(set "datei=%i" &set "datei=!datei:~3,10!" &md !datei! &echo move "%i" !datei!)"  
Mitglied: 129813
Solution 129813 Aug 24, 2016, updated at Aug 25, 2016 at 13:40:09 (UTC)
Goto Top
Or
@echo off
set "folder=C:\medi2008"   
if not exist "%folder%" md "%folder%"  
powershell -Executionpolicy ByPass -Command "gci '%folder%' -Filter *.zip -recurse | group {[regex]::match($_.Basename,'\d{4}-\d{2}-\d{2}').Value} | %%{md \"%folder%\$($_.Name)\" -Force | out-null; $_.Group | Move-Item -Destination \"%folder%\$($_.Name)\" -Force}"  
Regards
Member: medi2008
medi2008 Aug 25, 2016 updated at 12:31:13 (UTC)
Goto Top
Hi batchnewbie, Habe deinen OneZeiler mehrfach versucht, aus der Konsole und als .bat.
&echo entfernt.
Das Ergebnis waren immer leere Ordner. Siehe Bild.
Ich versuche weiter.
Gruss
lösung-batchnewbie
Member: medi2008
medi2008 Aug 25, 2016 at 12:38:43 (UTC)
Goto Top
Hallo highload, deine Lösung war sehr hilfreich. Die Ordner mit dem jeweiligen Datum als Ordnername werden jedoch immer direkt auf dem Laufwerk erstellt (in dem Fall Laufwerk H:\).
Habe in Zeile 02 Laufwerk C:\medi2008 mit H:\medi2008 ersetzt. Der Ordner medi2008 wird aber gar nicht erstellt. Die Ordner werden - wie oben erwähnt direkt auf H: erstellt.
Aber die Zip-Dateien werden tadellos in die jeweiligen Verzeichnisse verschoben.
Kann es sein, dass in Zeile 03 irgendwo der Pfad für das Erstellen der Ordner geregelt wird?
Danke und Gruss
Member: medi2008
medi2008 Aug 25, 2016 at 13:03:51 (UTC)
Goto Top
Hallo pieh-ejdsch, überfordert mich etwas. Deine Zeilen in einem .bat bewirken (bis jetzt noch) nichts.
Habe in Zeile 05 den Ordnernamen angepasst nach dem Verzeichnis in welchem die zip-Dateien drin sind. Ist das korrekt?
Gruss,
Mitglied: 129813
129813 Aug 25, 2016 updated at 13:40:40 (UTC)
Goto Top
Der Ordner medi2008 wird aber gar nicht erstellt.
You didn't say that this folder does not exist. but you can simply create it with an additional line before the powershell line runs face-wink
if not exist "%folder%" md "%folder%"
Then the folders will be created inside this folder face-wink

See changes above.
Regards
Member: medi2008
medi2008 Aug 25, 2016 updated at 14:06:59 (UTC)
Goto Top
highload
Thankx for your help.

Before processing all the zip-Files including the .bat-file are located in:
H:\DATEN\Test-Arbeit\Bearbeiten

this is how my .bat looks like:

@echo off
set "folder=H:\DATEN\Test-Arbeit\Bearbeiten\Alles-nach-Band"
if not exist "%folder%" md "%folder%"
powershell -Executionpolicy ByPass -Command "gci $folder -Filter *.zip -recurse | group {[regex]::match($_.Basename,'\d{4}-\d{2}-\d{2}').Value} | %%{md \"$folder\$($_.Name)\" -Force | out-null; $_.Group | Move-Item -Destination \"$folder\$($_.Name)\" -Force}"

After processing:
the data should appear there:
H:\DATEN\Test-Arbeit\Bearbeiten\Alles-nach-Band

but the folders are created here:
H:\

Kind regards
lösung-highload
Mitglied: 129813
129813 Aug 25, 2016 at 14:22:36 (UTC)
Goto Top
uups small typo, corrected above.
Member: pieh-ejdsch
pieh-ejdsch Aug 25, 2016 at 15:45:27 (UTC)
Goto Top
Hi medi2008,

ich habe die Zeilen in dem Batch noch etwas ergänzt.
Der Batch ist so geschrieben damit ein gefahrloses Testen erfolgen kann,
bevor an den wichtigen Daten gearbeitet wird.

Gib der Variable Test zum austesten des Batches den Inhalt: echo
Zum scharfstellen die Variable Test leer lassen.

Phil
Member: batchnewbie
batchnewbie Aug 25, 2016 at 16:23:22 (UTC)
Goto Top
Hi, du muss nur das echo entfernen nicht &echo!
&move muss es bei der scharf Stellung heißen!