gnozonav
Goto Top

Bestimme Anzahl an htm Files in Unterordner verschieben.

Ich beabsichtife eine Verschiebung von 63000 htm Files in Unterordner a la 600 Files.

Hallo,

Ich habe ein Problem und möchte dies durch einen Batch lösen. Wäre super, wenn sich jemand Zeit nimmt um mir dort auszuhelfen.

Ich habe um die 63000 .htm Files in dem Ordner "C:\MyHTMLHelp\Project\addin_a\Source" und möchte nun alle Dateien in Unterordner aufteilen. Jeder ordner sollte 600 .htm Files beinhalten. Bis auf den letzten, da ist es logisch, dass es nicht genau 600 sein können. Ist aber kein Problem.

Also:
600 htm Files in den Ordner "C:\MyHTMLHelp\Project\addin_a\Source\Ordner1"
600 htm Files in den Ordner "C:\MyHTMLHelp\Project\addin_a\Source\Ordner2"
...
usw.

Es muss aber beachtet werden, dass die Unterordner noch nicht existieren. Also muss ein neuer Ordner quasi in dem Verzeichnis "C:\MyHTMLHelp\Project\addin_a\Source" angelegt werden und dort dann die 600 Files eingeschoben werden.

Wäre super, wenn sich da jemand kurz zeit nehmen könnte. Bis jetzt hab ich es nur geschafft alle Dateien in einen Ordner zu schieben. Das mit der abzählung das nach 600 schluss ist, hab ich nicht hinbekommen. Auch das erstellen eines neuen Ordners ist mir noch nicht so ganz klar.

Also vielleicht hat ja jemand die Zeit und bastelt so einen kleinen Batch kurz und kann mir noch erklären, was er pro Code zeile genau macht, denn einfach nur die .bat ausführen hat ja nun auch keinen großen Lerneffekt.

Ich hab mir diesen Thread schon durchgelsen aber kann mangels fehlender Erfahrung im Bereich Batch keine Schlüsse draus ziehen.
Anzahl bestimmter Dateien per Batch verschieben

Mit freundlichen Grüßen

Lukas Patz

Content-ID: 171997

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

Ausgedruckt am: 23.11.2024 um 07:11 Uhr

pieh-ejdsch
pieh-ejdsch 24.08.2011 um 13:31:00 Uhr
Goto Top
moin Lukas,

magst Du etwas fertiges oder etwas zum selbst Probieren
Begrenzte Anzahl von Dateien verschieben

hier kannst Du noch etwas anpassen?

Bei Fragen einfach diese stellen.

Gruß Phil
GnozoNAV
GnozoNAV 24.08.2011 um 13:46:22 Uhr
Goto Top
Also ich hab mir deinen Link jetzt mal angeschaut und mit den Code genommen und so angepasst, wie ich denke, dass es richtig ist :D

::----snipp----Dateien-Blockweise-verschieben
@echo Off
set Woher="C:\MyHTMLHelp\Project\addin_a\Source"  
set "C:\MyHTMLHelp\Project\addin_a\Source\Ordner1"  
set "Dateityp=*.htm"  

pushD %Woher%

del "%temp%\tmp" 2>nul  
if exist "%temp%\tmp2" (move "%temp%\tmp2" "%temp%\tmp">nul ) else dir /b %Dateityp%>"%temp%\tmp"  

call :move 600
popD
goto :eof


:move
set "Nr=1"  
for /f "usebackq delims=" %%i in ("%temp%\tmp") do (@ECHO move "%%i" "%Dorthin%\"  
	setlocal enabledelayedexpansion
	if !Nr! == %1 endlocal & set "Nr=1"&more +%1 "%temp%\tmp">"%temp%\tmp2"&goto :eof  
	endlocal & set /a Nr+=1
)
::----snapp----Dateien-Blockweise-verschieben

Also sofern ich das jetzt richtig verstehe, würde er 600 htm Files in den Ordner1 verschieben? Muss ich dann jeweils einen neuen Ordner anlegen wie z.b. Ordner2 und die .bat dann ergänzen und wieder ausführen, bis ich keine htm Files mehr habe oder erstellt er automatisch einen neuen Ordner?

Sorry aber mit Batch kenn ich mich gar nicht aus, bin Navision Entwickler.

Zitat von @pieh-ejdsch:
magst Du etwas fertiges oder etwas zum selbst Probieren

Aus zeitgründen wohl eher etwas fertiges :/

Beste Grüße

Lukas
Skyemugen
Skyemugen 24.08.2011 um 14:34:38 Uhr
Goto Top
Aloha,

abgesehen davon, dass bei set "Dorthin=C:\..." das Dorthin bei dir verloren ging face-wink sollte die Wortgruppe Dateien-Blockweise-verschieben doch nahe legen, dass der Grundcode an sich auch nur das macht, alles von A nach B und nichts mit C, D etc. (geht auch aus dem alten Thread hervor).

move bewegt nur, erstellt aber nichts, dass heißt:
  • Entweder du legst bereits weitere Ordner an und änderst das pro Durchgang in der Batch
oder
  • Man lässt per Batch (von vornherein am Besten) die Verzeichnisse anlegen (mit Nummerierung und nur sofern notwendig und der vorangehende bereits existiert und per counter) und lässt ihn solange durchjagen, bis nichts mehr zum Verschieben vorhanden ist

Und weil ich heute meinen faulen Tag habe gibt's auch überlasse ich die weitere Abarbeitung meinen Batch-Kollegen face-wink

greetz André

edit @bastla, soso face-wink Da hätte ich zumindest eine Suchaktion starten müssen aber die Faulheit heute *lächz - so warm*
bastla
bastla 24.08.2011, aktualisiert am 18.10.2012 um 18:48:01 Uhr
Goto Top
@skye
Faul? Kann ich auch: Batch um Dateien nach Anzahl in Ordner abzulegen face-wink

Grüße
bastla

[Edit] @skye
Da hätte ich zumindest eine Suchaktion starten müssen
Das ist der Vorteil, wenn man(n) dabei war ... face-wink
[/Edit]
Friemler
Friemler 24.08.2011 um 15:30:24 Uhr
Goto Top
Hallo GnozoNAV,

teste mal folgendes:
@echo off

setlocal


set "SrcDir=C:\MyHTMLHelp\Project\addin_a\Source"  
set "FileType=htm"  
set "nFiles=600"  


set /a "Cntr=1"  

:Loop
  set "FilesAvailable="  

  for /f "tokens=1* delims=:" %%a in ('dir /b /a:-d /o:n "%SrcDir%\*.%FileType%" 2^>NUL ^| findstr /n "^"') do (  
    if %%a leq %nFiles% (
      if %%a equ 1 (
        md "%SrcDir%\Ordner%Cntr%"  
      )

      move "%SrcDir%\%%b" "%SrcDir%\Ordner%Cntr%\%%b"  
      set "FilesAvailable=1"  
    )
  )

  set /a "Cntr+=1"  
if defined FilesAvailable goto :Loop

Im Kopf der FOR-Schleife ließt der DIR-Befehl alle HTM-Dateien im Quellverzeichnis ein. Seine (wegen /o:n alphabetisch sortierte) Ausgabe (wegen 2^>NUL aber nicht die Fehlermeldungen) wird über eine Pipe an FINDSTR weitergereicht, was wegen dem Parameter "^" (steht für Zeilenanfang) alle Zeilen findet und wegen /n Nummern vor alle Zeilen schreibt.

Die daraus resultierenden Ausgabezeilen werden von der FOR-Schleife in Tokens zerlegt (siehe mein Tutorial zur FOR-Schleife). Das erste Token ist wegen delims=: die Zeilennummer (enthalten in der Laufvariablen %%a), das zweite Token ist wegen dem Stern in tokens=1* der Rest der Zeile, also der Dateiname (enthalten in der automatisch erzeugten Laufvariablen %%b).

In der Schleife wird geprüft, ob die Zeilennummer kleiner oder gleich 600 ist. Wenn ja wird geprüft ob sie gleich 1 ist. Wenn ja, wird ein neues Verzeichnis angelegt. Dazu wird die Zählervariable Cntr benutzt. Danach wird die gerade aktuelle Datei in das neu erstellte Verzeichnis verschoben und die Variable FilesAvailable auf 1 gesetzt.

Wenn die geforderte Anzahl Dateien verschoben wurde (wegen Zeile 8 also 600 Stück), stimmt die Bedingung in Zeile 17 nicht mehr und alle restlichen Dateien werden überlesen.

Nach dem Ende der FOR-Schleife wird in Zeile 28 geprüft, ob die Variable FilesAvailable existiert. Das ist nur der Fall, wenn zuvor die FOR-Schleife durchlaufen wurde, da die Variable in Zeile 14 gelöscht wird. Falls die Variable existiert, wird zum Label :Loop gesprungen und der Ablauf beginnt von neuem.

Diesmal ist die Dateiliste, die von DIR geliefert wird, um 600 Dateien kürzer.

Das wird solange wiederholt, bis DIR (wegen Zeile 7) keine HTM-Dateien mehr findet, dann wird die FOR-Schleife nicht durchlaufen und FilesAvailable existiert in Zeile 28 nicht, was zum Beenden des Scripts führt.

Gruß
Friemler
GnozoNAV
GnozoNAV 24.08.2011 um 16:09:47 Uhr
Goto Top
Der Code von Friemler ist ja mal sowas von geil face-smile
Er hat auf jedenfall genauso funktioniert, wie ich mir das vorgestellt habe und ging sogar richtig fix.

Ich möchte mich nocheinmal herzlich bei allen Leuten bedanken, die mir geholfen haben und besonders bei Friemler, der sich die Zeit genommen hat und extra einen Batch geschrieben hat und eine Erklärung dazu. DANKE face-smile

Der Batch ist ja auch zemlich nützlich allgemein um mal einen Ordner aufzuräumen.

Beste Grüße

Lukas