paulkuhn
Goto Top

per Batch alle dateien eines Ordners jeweils in einen Ordner der den Namen der Datei erhält verschieben.

Hallo...

habe folgendes Batch-Anliegen:

Es sollen in einer Schleife alle Dateien (z.B. 123.pdf, 456.pdf, 456.log) eines Ordners z.B. (x:\in\) jeweils verschoben werden in einen Ordner mit Namen der Datei z.B. x:\123\123.pdf, x:\456\456.pdf und x:\456\456.log.
Dateien mit gleichem Dateinamen aber anderer Endung soll im gleichen Zielordner landen. Meist ist dieser Zielordner korrekt bezeichnet schon vorhanden, in wenigen Fällen nicht. Hier sollte der Ordner also vorher angelegt werden.
Der Dateiname ist in der Länge nicht fix. Die Batch-Datei wird nicht vom gleichen Ordner aufgerufen...

Für die meisten hier sicher trivial. Leider nicht für mich. Bin für alle Tipps dankbar...

Content-Key: 107144

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

Printed on: April 26, 2024 at 07:04 o'clock

Member: ANGER77
ANGER77 Jan 26, 2009 at 15:51:12 (UTC)
Goto Top
ICh weiß leider nicht ob dir das weiterhelfen kann, aber Robocopy ist für solche Angelegenheiten immer sehr gut.

http://www.wintotal.de/Artikel/robocopy/robocopy.php

Gruß Rico
Member: paulkuhn
paulkuhn Jan 26, 2009 at 16:35:32 (UTC)
Goto Top
Hmm...
zunächst Danke für den Hinweis.
Ich hätte das Problem aber gern nur mit Batchscript gelöst, ohne Aufruf zusätzlicher Tools.

Allerdings strauchele ich schon in der for-schleife bei dem korrekten Auslesen des Parameters (Dateiname ohne Endung)
Member: Biber
Biber Jan 26, 2009 at 17:53:17 (UTC)
Goto Top
Moin paulkuhn,

willkommen im Forum.
Im Prinzip brauchst Du nur ein bis zwei Zeilen vom CMD-Prompt für Dein Vorhaben.
Eine zeile, um das (eventuell) noch nicht vorhandene verzeichnis anzulegen und eine Anweisung, um die Dateien in dieses Verzeichnis zu MOVEn.

Demo am CMD-Prompt [einzugebene Zeilen beginnen mit ">"]
> for %i in (d:\temp1\*.pdf) do @echo if not exist "%~dpi%~ni" md "%~dpi%~ni"  
> for %i in (d:\temp1\*.pdf) do @echo move "%i" "%~dpi%~ni\*.*"  
Bei meiner vorhandenen Datei d:\temp1\sy6help.pdf würde als ECHO herauskommen:
if not exist "d:\temp1\sy6help" md "d:\temp1\sy6help"  
move "d:\temp1\sy6help.pdf" "d:\temp1\sy6help\*.*"  

In einem Batch auf ALLE Dateien angewandt (nicht nur auf *.pdf) sähe das so aus:
::------snipp MoveIntoSubdirs.cmd
@FOR %%i IN (d:\EinStartVerzeichnis\*.*) do @(
          IF NOT EXIST "%%~dpi%%~ni" MD "%%~dpi%%~ni"  
           MOVE "%%i" "%%~dpi%%~ni\"  
)
[Edit] ungetestete Skizze - aber erkennbar (s.u.) [/Edit]

Dieses ganze kryptische %%~pdnxi-Geraffel ist nur in den ersten zwei Leseversuchen unverständlich,
mit der Hilfe zu FOR/? im unteren Drittel hast Du den Code schnell geknackt.

Grüße
Biber
Member: paulkuhn
paulkuhn Jan 26, 2009 at 19:01:03 (UTC)
Goto Top
Sauber...

Funktioniert nach einigen kleinen Änderungen sofort.
Es musste noch ein Leerzeichen zwischen IN und der Klammer und der Move-Befehl muss ohne *.* am Ende abgesetzt werden.

Dank dir sehr...

Aber:
was muss geändert werden, damit die Erstellung der Ordner und das Verschieben nicht in Unterordnern des Hauptordners stattfindet, sondern eine Ebene höher.
Also:
Hauptordner ist c:\test\out, darin befinden sich die Dateien, z.B. 157.pdf und 158.pdf
Die neuen Ordner sollen in c:\test\ erstellt werden und entsprechend die Datein von c:\test\out in die neuen Ordner auf c:\test\157\ und c:\test\158\ verschoben werden.

Gruß Paule
Member: Biber
Biber Jan 26, 2009 at 20:58:20 (UTC)
Goto Top
Moin paulkuhn,

ausgerechnet bei dem letzten Kommentar habe ich NICHT druntergeschrieben "[ungetestete Skizze]"...*g

Ich korrigier es gleich oben.

Zu Deiner Frage: Wenn Du ein "festes" neues Root-Zeilverzeichnis hast:
--> ganz klar, dann schreib es fest rein in die (ohnehin nur eine) Zeile.
Dann wird im ersten Wurf daraus:
::------snipp MoveIntoSubdirsV2.cmd
@FOR %%i IN(d:\EinStartVerzeichnis\*.*) do @(
          IF NOT EXIST "C:\test%%~ni" MD "c:\test%%~dpi%%~ni"  
           MOVE "%%i" "c:\test%%~ni\"  
)
...und wenn es bisschen wartbarer werden soll:
::------snipp MoveIntoSubdirsV3.cmd
@echo off & setlocal
Set "QuellRoot=d:\EinStartVerzeichnis"  
Set "ZielRoot=D:\test"  
@FOR %%i IN ("%QuellRoot%\*.*") do @(  
          IF NOT EXIST "%ZielRoot%\%%~ni" MD "%zielRoot%\%%~dpi%%~ni"  
           MOVE "%%i" "%ZielRoot%\%%~ni\"  
)
[ungetestete Skizze]

Grüße
Biber
Member: paulkuhn
paulkuhn Jan 27, 2009 at 09:06:22 (UTC)
Goto Top
Nochmal einen herzlichen Dank!!!

Abgesehen von den überaus kompetenten Antworten ist besonders Prima,
daß sogar Anleitungen zum besseren Verständniss des Codes gegeben werden (in den einleitenden Blöcken, mit Hinweis auf die "Debug-Möglichkeit" mit @echo).

Das hat mir sehr geholfen, so das ich tatsächlich spät am Abend noch selbstständig auf eine ähnliche Lösung gekommen bin.
(Allerdings jeweils festverdrahtet, ohne Nutzung von Variablen für die Verzeichnisse) Dein neuer Code ist natürlich viel besser. Evtl. werde ich das noch so erweitern, das diese Source und Target-Variablen aus ner externen Datei eingelesen werden(Diese aus DB generiert) So das alles ohne weiteres editieren flutscht. Dazu gibt es hier ja reichlich Anleitungen und Hilfestellung. Toll, wie ein paar wenige Zeilen ein Problem lösen können....

Top!!!

Gruß Paule