pieh-ejdsch
Goto Top

Inhalt Verschieben zum sichern auf Externe Medien nach Dateianzahl bzw Medium Groesse mit Logging in Ordner

Die HD ist wiedermal kurz vorm Überlaufen.
allerhöchste Zeit wiedermal die wichtigen Daten wie MP3 aus Downloadshop und gute RSS Feeds wie auch andere wichtige Dokumente auf ein Externes Medium zu sichern.

Platzprobleme auf der HDD - dann ist einfach mal aufräumen ist angesagt.

eigentlich wollte ich mir nur meine AVI Files sichern.
das ist ja noch ganz einfach, weil diese sind fast alle gleich groß und passen zu jeweils 25 Stück bequem auf eine DVD5.
Sichern nach Stückzahl
:test
set schieb=1 & set /a NR = 0
for /f "delims=" %%i in ('Dir /b *.avi') do call :schieb  
if %NR% geq 25 (set /a NR = 0 & set "schieb=" ) else goto :eof  
set /a zahl = 1
:anf
if exist OP%zahl%. (set /a zahl + = 1 & goto :anf) else md "OP%zahl%."  
for /f "delims=" %%i in ('Dir /b *.avi') do call :schieb "%%i"  
echo.>>Brenn-log.txt
goto :test
:schieb
set /a NR + = 1
if defined schieb goto :eof
if %NR% leq 25 (echo OP%zahl% %~1>>Brenn-log.txt) else goto :eof
move %1 "OP%zahl%\%~1"  
das ganze habe ich dann mit Subroutine gemacht und ohne delayed expansion, da ja in manchen Dateinamen auch Ausrufezeichen sind.
die AVI Dateien werden natürlich erst verschoben, wenn die gewünschte Stückzahl erreicht ist.
dazu wird das ganze noch in eine LOG-Datei geschrieben.

nun wird das Ganze ein wenig komplizierter.
das sichern der MP3 Files. die sind ja alle unterschiedlich Groß. also nix mit Anzahl!

Erläuterung der Funktionsweise der Batch
das Ganze nun mit Berechnung der Größe und bei einzelner (und/oder mehrerer) Überschreitung der Filegröße zur Mediumgröße mit Meldung.
sollten noch weitere Dateien auf das Medium passen - werden die Dateien noch nicht Verschoben, stattdessen kommt eine Abfrage wenn noch weitere Dateien ähnlich der Größe vom Durchschnitt der anderen Dateien auf das Medium passen würden.
Verschieben der Daten in einen (Zähl-)Unterordner mit gleichzeitigem erstellen vom Log.

es war ein bischen kniffliger, da die Forschleife eine Variable beim Übergeben in eine Subroutine als Parameter nicht mit den Prozentzeichen übergibt, sondern dieses einfach entfernt.
also erst die For-Variable in eine Umgebungsvariable einsetzen. Zeile 23
achso und die Zeile 39 kann ich nicht in die Zeile 36 integrieren, da in den MP3 Files auch Klammern enthalten sind.
funktioniert also nur auserhalb, weil ich ja die Gänsefedern "ach-was" -Füsschen nicht brauchen kann.
und das (und) & im Dateinamen soll ja auch richtig im Log-Buch stehen. daher die Umänderung der Variable.

in die Zeile 09 sind entsprechend des Medium den jeweiligen Wert vom Medium hinter dem (istgleich) = aus dem Kopfbereich einzusetzen.
es kann natürlich auch jeder beliebige andere byte-Wert für den Sicherungsordner angenommen und eingesetzt werden.
Die Sicherung funktioniert dewswegen genauso.
in Zeile 11 wird entsprechend der Dateiauswahl gefiltert bzw noch ein Pfad vorangestellt.
Sichern nach Mediumgröße

[ EDIT]

Hier gibts den Funktionsfähigen Batch

[
red| /EDIT]

@echo off
:: Einstellungen fuer die SicherungsDatentraegerGroesse in byte
::X 1GB   1.073.741.824= 1073741824
:: ---------------Speicher-Mediengroessen
::X CD80    700.000.000= 700000000
::X DVD5  4.700.000.000= 4700000000
::X DVD9  8.500.000.000= 8500000000
::
set Medium=700000000
:: ---------------Einstellung (Pfad\)Typ 
set typ=*.mp3
:: ---------------
set "filenr=0"   
:test
set "back=" & set /a MediumG = 0,SNR = 0,schieb = 1,NR = 1,NRb = 0  
for /f "delims=" %%i in ('Dir /b %typ% 2^>nul') do call :zaehl %%~zi  
if defined back (if %NR% lss 2 if not %filenr% == 0 (echo Datei %filenr% groesser als Medium!& set /a filenr + = 1 & goto :test ) else  set /a filenr + = 1 & goto :test ) else if %NR% gtr 1 (call :posttest ) else if %filenr% gtr 0 (echo %NRb% %typ:~-3%-Dateien fuer Medium zu gross!& pause & goto :eof ) else echo Fertig!& pause & goto :eof
if defined sichern (if /i "%sichern%"=="j" (echo.) else echo Fertig!& goto :eof )  
set /a zahl = 1,NRa = 0
:anf
if exist %typ:~-3%-%zahl%. (set /a zahl + = 1 & goto :anf) else md "%typ:~-3%-%zahl%."  
echo ---------------%typ:~-3%-%zahl%--------------->>%typ:~-3%-Brenn-log.txt
for /f "delims=" %%i in ('Dir /b %typ%') do (set "logtxt=%%i" & call :schieb )  
goto :test
:zaehl
set /a NRb + = 1
if %NRb% lss %filenr% goto :eof
if defined back goto :eof
set /a MediumG + = %1
if %Medium% gtr %MediumG% (set /a NR + = 1 ) else set back=1
goto :eof
:schieb
set /a NRa + = 1
if %NRa% lss %filenr% goto :eof
set /a NR - = 1
if %NR% gtr 0 (call :loggen ) else goto :eof
move "%logtxt%" "%typ:~-3%-%zahl%\%logtxtx%"& goto :eof  
:loggen
echo %typ:~-3%-%zahl% %logtxt:&=^&%>>%typ:~-3%-Brenn-log.txt& goto :eof
:posttest
set /a SNR = NR - 1
set /a schnitt = MediumG / SNR
:postzaeh
if not defined back (call :zaehl %schnitt% & goto :postzaeh ) else set /a FNR = NR - SNR - 1
if %FNR% gtr 1 (set "mz=en ") else if %FNR%==0 (set /a NRa - = 1 &set sichern=j& goto :eof ) else set "mz= "  
echo Sicherungsende ist erreicht. 
echo Es koennte%mz:~ 1% zusaetzlich noch %FNR% Datei%mz%in den Medium-Ordner eingefuegt werden!
echo Trotzdem Verschieben? [J] [N]
set /a NRa - = %FNR% - 1 & set /p sichern=

ja sonst... vllt hat jemand noch eine andere Idee bzw Ergänzung dazu.
vllt für Unterordner und mehrere Dateitypen?

Content-Key: 121438

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

Ausgedruckt am: 29.03.2024 um 14:03 Uhr

Mitglied: pieh-ejdsch
pieh-ejdsch 28.07.2009 um 03:16:03 Uhr
Goto Top
so hab jetzt ein bissel gebastelt und komme nicht weiter bei den Unterordnern und der Größenweitergabe der Files....

Zeile 24 hab ich schon die Größenübergabe erst in der Subroutine (zeile 34) gemacht aber er rechnet nicht in Zeile 37 da er die Größenwerte des Files nicht bekommt.

::@echo off
:: Einstellungen fuer die SicherungsDatentraegerGroesse in byte
::X 1GB   1.073.741.824= 1073741824
:: ---------------Speicher-Mediengroessen
::X CD80    700.000.000= 700000000
::X DVD5  4.700.000.000= 4700000000
::X DVD9  8.500.000.000= 8500000000
::
set Medium=7000000
:: ---------------Einstellung (Pfad\)Typ 
set pfad=*
set typ=*.*
:: ---------------
pause
::set Upfad=1
if "%typ:~-3%"=="*.*" (set "typ=" & set "log=all-Brenn-log.txt") else set log=%typ:~-3%-Brenn-log.txt  
::set fillin=1
::
if "%pfad:~ -1%"=="*" for /f "tokens=*" %%i in ('dir "%pfad:~ 0, -1%" /a:d /b') do set "untpfad=%pfad:~ 0, -1%%%i\" & call :vtest  
:vtest
set "filenr=0"  
:test
set "back=" & set /a MediumG = 0,SNR = 0,schieb = 1,NR = 1,NRb = 0  
for /f "delims=" %%j in ('Dir /a:-d /b "%untpfad%%typ%" 2^>nul') do echo %%j &call :zaehl "%untpfad%%%~j"  
if defined back (if %NR% lss 2 if not %filenr% == 0 (echo Datei %filenr% groesser als Medium!& set /a filenr + = 1 & goto :test ) else  set /a filenr + = 1 & goto :test ) else if %NR% gtr 1 (call :posttest ) else if %filenr% gtr 0 (echo %NRb% %typ:~-3%-Dateien fuer Medium zu gross!& pause & goto :eof ) else echo Fertig!& pause & goto :eof
if defined sichern (if /i "%sichern%"=="j" (echo.) else echo Fertig!& goto :eof )  
set /a zahl = 1,NRa = 0
:anf
if exist %log:~ 0, 3%-%zahl%. (set /a zahl + = 1 & goto :anf) else md "%log:~ 0, 3%-%zahl%."  
echo ---------------%typ:~-3%-%zahl%--------------->>%log%
for /f "delims=" %%i in ('Dir /b "%untpfad%%typ%"') do (set "logtxt=%%i" & call :schieb )  
goto :test
:zaehl
set /a NRb + = 1
if %NRb% lss %filenr% goto :eof
if defined back goto :eof
set /a MediumG + = %~z1
if %Medium% gtr %MediumG% (set /a NR + = 1 ) else set back=1
goto :eof
:schieb
set /a NRa + = 1
if %NRa% lss %filenr% goto :eof
set /a NR - = 1
if %NR% gtr 0 (call :loggen ) else goto :eof
move "%untpfad%%logtxt%" "%log:~ 0, 3%-%zahl%\%logtxtx%"& pause & goto :eof  
:loggen
echo %untpfad%%typ:~-3%-%zahl% %logtxt:&=^&%>>%log%& goto :eof
:posttest
set /a SNR = NR - 1
set /a schnitt = MediumG / SNR
:postzaeh
if not defined back (call :zaehl %schnitt% & goto :postzaeh ) else set /a FNR = NR - SNR - 1
if %FNR% gtr 1 (set "mz=en ") else if %FNR%==0 (set /a NRa - = 1 &set sichern=j& goto :eof ) else set "mz= "  
echo Sicherungsende ist erreicht. 
echo Es koennte%mz:~ 1% zusaetzlich noch %FNR% Datei%mz%in den Medium-Ordner eingefuegt werden!
echo Trotzdem Verschieben? [J] [N]
set /a NRa - = %FNR% - 1 & set /p sichern=
Mitglied: pieh-ejdsch
pieh-ejdsch 01.09.2009 um 03:20:18 Uhr
Goto Top
So Jetzt habe ich das Script Fertig. Besser gesagt Znoch ein extra dazu gemacht

erstmal Habe ich noch einen Umlauteumbenenner gemacht:

::----schnipp---AVI-Umbenamsen-fuer-CDVD.bat 
if "%~1"=="" (for /f "tokens=2,*" %%i in ('dir "''zxy." 2^>nul') do if "%%i"=="von" (set "pfad=%%~fj" )) else set "pfad=%~1"  
PushD "%pfad:~0,-1%  
for /f "tokens=*" %%i in ('dir /b *.avi') do set "file=%%i" & call :ren  
pause& goto :eof
:ren
set "new=%file: =.%"  
::set "new=%file:*ewis.=%"  
if "%new:~ 4, 1%" == "x" set "new=%new:~0,1%%new:*x=%"  
set "new=%new:-=%"  
set "new=%new:..=.%"  
goto :Umlaute
set "new=%new:ä=ae%"  
set "new=%new:ß=ss%"  
set "new=%new:ö=oe%"  
set "new=%new:ü=ue%"  
:Umlaute
set "new=%new:Ž=Ae%"  
set "new=%new:™=Oe%"  
set "new=%new:š=Ue%"  
set "new=%new:á=ss%"  
set "new=%new:„=ae%"  
set "new=%new:”=oe%"  
set "new=%new:=ue%"  
ren "%file%" "%new%"  
::----schnapp---AVI-Umbenamsen-fuer-CDVD.bat


Und hier ist das eigentliche Batch welches Die im Batch Angegeben Dateien - hier AVIs - in die Ordner Verschiebt. Es könnten also auch bis zu einer Größe vom 2 Petabyte die Sicherungsordner befüllt werden. wenn in den Ordner nicht mehr reingeht als die Angegebe Mediumgröße wird ein nächster Ordner erstellt und bis zum Größenbegrenzer befüllt. wenn dann noch ein paar Dateien eingefüllt werden könnten, wird eine Nachfrage kommen ob man den letzten Ordner trotzdem sichern möchte.
Der Batch Arbeitet mit Dateigrößen bis 2 Petabyte. Bei einer Durschnittlichen Dateigröße unter 1MB ist die Durchschnittsberechnung ungenau. Es wird auch eine Log Datei geschrieben. zB. avi-Brenn-log.txt. Es kommt noch eine Meldung wieviele Sicherungmedien erstellt wurden.

Der Batch Arbeitet entweder im Ordner wenn mann Ihn anklickt oder über CMD mit kompletter Pfadangabe des Ordners welchen ma sichern möchte. Also kann auch der Ordner auf den Batch gezogen und abgelegt werden.


::--schnipp--AVInachDVD5Ordnerverschieben.bat---- 
@echo off
:: Einstellungen fuer die SicherungsDatentraegerGroesse in Mibibyte
::X 1GB   1.073.741.824= 1073,741824
:: ---------------Speicher-Mediengroessen in Megabyte
::X CD80    700.000.000= 700,000000
::X DVD5  4.700.000.000= 4700,000000
::X DVD9  8.500.000.000= 8500,000000
:: Fuer die Mediengroesse hier vom Bytewert die hinteren 6 Stellen weglassen
set Medium=4700
:: ---------------Einstellung (Pfad\)Typ 
if "%~1"=="" (for /f "tokens=2,*" %%i in ('dir "''zxy." 2^>nul') do if "%%i"=="von" (set "pfad=%%~fj" )) else set "pfad=%~1"  
if not "%pfad:~-1%" == "\" set "pfad=%pfad%\"  
PushD "%pfad:~0,-1%"  

set typ=*.avi
:: ---------------
set /a filenr = 0 , Fertig = 0
:test
set "back=" & set /a MediumG = 0 , SNR = 0 , schieb = 1 , NR = 1 , NRb = 0  
for /f "delims=" %%i in ('Dir /b %typ% 2^>nul') do call :zaehl %%~zi  
if defined back (if %NR% lss 2 if not %filenr% == 0 (echo Datei %filenr% groesser als Medium!& set /a filenr + = 1 & goto :test ) else  set /a filenr + = 1 & goto :test ) else if %NR% gtr 1 (call :posttest ) else if %filenr% gtr 0 (echo %NRb% %typ:~-3%-Dateien fuer Medium zu gross!& pause & PopD & goto :eof ) else echo %Fertig% Medien Fertig!& pause & PopD & goto :eof
if /i "%sichern%"=="j" (echo.>nul) else echo %Fertig% Medien Fertig!& pause & PopD & goto :eof  
set /a zahl = 1,NRa = 0
:anf
if exist %typ:~-3%-%zahl%. (set /a zahl + = 1 & goto :anf) else (md "%typ:~-3%-%zahl%." & set /a Fertig + = 1 )   
echo ---------------%typ:~-3%-%zahl%--------------->>%typ:~-3%-Brenn-log.txt
for /f "delims=" %%i in ('Dir /b %typ%') do (set /a Files + = 1 & set "logtxt=%%i" & call :schieb )  
goto :test
:zaehl
set /a NRb + = 1
if %NRb% lss %filenr% goto :eof
if defined back goto :eof
call :rechner %1
goto :eof
:schieb
set /a NRa + = 1
if %NRa% lss %filenr% goto :eof
set /a NR - = 1
if %NR% gtr 0 (call :loggen ) else goto :eof
move "%logtxt%" "%typ:~-3%-%zahl%\%logtxtx%"& goto :eof  
:loggen
echo %typ:~-3%-%zahl% %logtxt:&=^&%>>%typ:~-3%-Brenn-log.txt& goto :eof
:posttest
set /a SNR = NR - 1
if not defined Qschnitt set schnitt=700000 & set QBRS=1 & goto :postzaeh
set schnitt=%Qschnitt%000000
:postzaeh
if not defined back (call :zaehl %schnitt% & goto :postzaeh ) else set /a FNR = NR - SNR - 1
if %FNR% gtr 1 (set "mz= en") else if %FNR%==0 (set /a NRa - = 1 &set sichern=j& goto :eof ) else set "mz= "  
echo Sicherungsende ist erreicht. 
if defined QBRS echo Durchnittliche Dateigroesse unter 1 MB daher ist dieser Wert ungenau! & echo Daher kann dieser Wert stark abweichen.
echo Es koennte%mz:~ 2% zusaetzlich noch %FNR% Datei%mz:* =% in den Medium-Ordner eingefuegt werden!
echo Trotzdem Verschieben? [J] [N]
set /a NRa - = FNR - 1 & set /p sichern=
goto :eof
:rechner
set /a gignr = 0 , petnr = 0
set alls=%1
if %alls% gtr 999999 (set giga=%alls:~ 0, -6%& set /a gignr + = 1 , kilo = 1%alls:~-6%) else (set /a kilo = %alls:~-6% , giga = 0 , peta = 0 & goto :woutgig )
if %giga% gtr 999999 (set peta=%giga:~ 0, -6%& set /a petnr + = 1 , giga = 1%giga:~-6%) else (set /a giga = %giga:~-6% , peta = 0)
:woutgig
set Falls=%MediumG%
if not defined Falls set Falls=0
if %Falls% gtr 999999 (set Fgiga=%Falls:~ 0, -6%& set /a Fkilo  = 1%Falls:~ -6% + kilo , gignr + = 1) else (set /a Fkilo = %Falls% + kilo , Fgiga = 0 , Fpeta = 0 )
if %Fgiga% gtr 999999 (set Fpeta=%Fgiga:~ 0, -6%& set /a Fgiga  = 1%Fgiga:~ -6% + giga - gignr + %Fkilo:~ 0, -6% 2>nul , petnr + = 1) else (set /a Fgiga = %Fgiga% + giga - gignr + %Fkilo:~ 0, -6% 2>nul, Fpeta = 0 )
if %Fpeta% gtr 0 set /a Fpeta = Fpeta + peta - petnr + %Fgiga:~ 0, -6% , 
set Fkilo=%Fkilo:~ -6%
if %Fgiga% == 0 (set "Fgiga=") else set Fgiga=%Fgiga:~ -6%  
if %Fpeta% == 0 set "Fpeta="  
if not defined back set /a Qschnitt = %Fpeta%%Fgiga% / NR
if %Medium% gtr %Fpeta%%Fgiga% (set /a NR + = 1 ) else set /a back = 1
if %Medium% equ %Fpeta%%Fgiga% if 1000000 gtr 1%Fkilo% (set /a NR + = 1 ) else set /a back = 1
set MediumG=%Fpeta%%Fgiga%%Fkilo%
goto :eof
::--schnapp--AVInachDVD5Ordnerverschieben.bat---- 

Gruß Phil