Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Welche Parameter muss ich in einer Batch setzen um beim zippen die compression sowie die Geschwindigkeit zu definieren?

Frage Entwicklung Batch & Shell

Mitglied: D3ns007

D3ns007 (Level 1) - Jetzt verbinden

30.10.2009 um 10:28 Uhr, 5666 Aufrufe, 12 Kommentare

Hallo ich möchte mit 7zip ein paar Dateien komprimieren. Und das funktioniert soweit auch ganz gut. Nur dauert das zippen zu lange und deswegen muss ich das Script etwas optimieren.

Ich hab folgenden Quelltext:

01.
@echo off & setlocal 
02.
set "source=D:\SOURCEPATH" 
03.
set "dest=F:\DESTPATH" 
04.
set "ext=mda" 
05.
 
06.
for %%i in ("%source%\*.%ext%") do ( 
07.
set dupe= 
08.
echo Vergleiche %%i 
09.
if exist "%dest%\%%~nxi" do fc /b "%%i" "%dest%\%%~nxi">nul && set dupe=true 
10.
if not defined dupe copy "%%i" "%dest%" 
11.
12.
REM Verbliebene Dateien kopieren 
13.
del "%source%\*.%ext%" 
14.
 
15.
 
16.
Pushd "%dest%" 
17.
For /F "Delims=" %%A in ('Dir /B/A-D "%dest%\*.%ext%"') Do call :ZipIt "%%~fA" 
18.
Popdrem 
19.
Del "%dest%\*.%ext%"  
20.
Goto :Eof 
21.
:ZipIt 
22.
Set "Zip=%~n1" 
23.
Set "Zip=%archive%%Zip:~0,9%.zip" 
24.
"C:\Programme\7-Zip\7z.exe" u "%Zip%"  %1

Ich habe schon nach Anregungen im I-Net gesucht und auch schon etwas gefunden.
Nämlich : -m{Parameters}: set compression Method

Aber jetzt weiß ich nicht wo ich das in mein Quellcode packe und was ich in die Klammern schreibe wo "Parameters" steht.

Könnt Ihr mir helfen?

Mile Grazie
Mitglied: Iwan
30.10.2009 um 11:18 Uhr
hallo,

warum nutzt du nicht einfach die Hilfe von 7-Zip selber?
in der Hilfedatei unter
  • Command Line Version -> Switches -> -m (Set compression Method) switch
ist alles aufgeführt, was du wissen möchtest und was du einsetzen kannst
Bitte warten ..
Mitglied: D3ns007
30.10.2009 um 11:52 Uhr
Ahh sehr gut. Danke

Hab es gefunden.
ich teste das mal.
Bitte warten ..
Mitglied: D3ns007
30.10.2009 um 14:02 Uhr
Also, ich habe an den bisherigen Quellcode in der 24ten Zeile die Parameter -mx1 angehängt.
Das ganze bringt mir eine verbesserung um ganze 20 sekunden aber verschlechtert die Kompression auch um 36%.

Könnt Ihr mal bitte über den Quellcode schauen und mir sagen was ich ändern muss um auf unter eine Minute zu kommen?
Bisher braucht das Programm mehr als 4 Minuten um eine Datei zu zippen. Das Problem liegt daran das jede Datei mit allen bisher bestehenden Ziparchiven verglichen werden.

Grüße
Bitte warten ..
Mitglied: bastla
30.10.2009 um 15:41 Uhr
Hallo D3ns!007!

Die Schleife lässt sich zwar auf
01.
for %%i in ("%source%\*.%ext%") do (  
02.
    echo Vergleiche %%i  
03.
    if exist "%dest%\%%~nxi" do fc /b "%%i" "%dest%\%%~nxi">nul || copy "%%i" "%dest%"  
04.
)
verkürzen, aber ob das viel bringt ...

Alternativ (je größer die Datei, desto sinnvoller) könntest Du zunächst die Dateigrößen vergleichen und nur bei gleich großen Dateien dann noch zusätzlich den byteweisen Vergleich durchführen:
01.
for %%i in ("%source%\*.%ext%") do ( 
02.
    set dupe= 
03.
    echo Vergleiche %%i 
04.
    for %%v in ("%dest%\%%~nxi") do if "%%~zi"=="%%~zv" fc /b "%%i" "%%~v">nul && set dupe=true 
05.
    if not defined dupe copy "%%i" "%dest%">nul 
06.
)
Grüße
bastla
Bitte warten ..
Mitglied: D3ns007
30.10.2009 um 15:59 Uhr
Hy Bastla,
danke für die Nachricht.

Dein Quellcode verkürzt das ganze nur sehr bedingt.
Nachdem eine Datei gezippt wurde und ins Archiev gepackt wurde, sollte sie gelöscht werden.
Das bringt den Vorteil das nicht immer alle Dateien verglichen werden müssen.

Weißt du wie ich das in diesem Quellcoe umsetzen kann?

Grüße

D3ns!007
Bitte warten ..
Mitglied: bastla
30.10.2009 um 16:27 Uhr
Hallo D3ns!007!
Dein Quellcode verkürzt das ganze nur sehr bedingt.
Das hatte ich befürchtet ...
Nachdem eine Datei gezippt wurde und ins Archiev gepackt wurde, sollte sie gelöscht werden.
Soferne 7zip verlässliche Errorlevel liefert, könntest Du die letzte Zeile auf
"C:\Programme\7-Zip\7z.exe" u "%Zip%"  %1 && del %1
ändern ...

Grüße
bastla
Bitte warten ..
Mitglied: D3ns007
30.10.2009 um 16:36 Uhr
Also das Kommando macht zwar genau das was ich mir vorgestellt habe aber schneller wird es nicht dadurch. Eher langsamer
Ich hab das Gefühl das: Je größer das Ziparchiv desto langsamer der Vorgang. Kann man anstatt das ganze Archiv nur den Archivnamen mit dem Dateinamen vergleichen? Das müsste noch viel schneller gehen und das unabhängig davon ob das Archiv groß oder klein ist. Es wäre zwar nicht mehr so resistent gegen redundanzen aber schneller bestimmt.

Nur: Wie geht das???

Völlig überfragt
Bitte warten ..
Mitglied: bastla
30.10.2009 um 16:48 Uhr
Hallo D3ns!007!
Kann man anstatt das ganze Archiv nur den Archivnamen mit dem Dateinamen vergleichen? Das müsste noch viel schneller gehen und das unabhängig davon ob das Archiv groß oder klein ist. Es wäre zwar nicht mehr so resistent gegen redundanzen aber schneller bestimmt.
Meinst Du das so
if not exist "%dest%\%%~nxi" copy "%%i" "%dest%"
oder so:
01.
if not exist "%Zip%" "C:\Programme\7-Zip\7z.exe" u "%Zip%"  %1 || goto :eof 
02.
del %1
Grüße
bastla
Bitte warten ..
Mitglied: Biber
30.10.2009 um 17:47 Uhr
Moin D3ns!007,

wenn irgendein Skript unerwartet und auffällig langsam läuft, dann liegt es nach meinen Beobachtungen sehr selten daran, dass jemand vergessen hat, den Parameter "/Turbo=on" oder ähnliches mitzugeben.
Meistens ist in solchen Fällen irgendwo ein Denkfehler in der Strategie.

lass mich doch noch mal nachfragen:
  • ist Laufwerk F:, das %dest%-Laufwerk. denn auch so schnell wie Laufwerk C:? Oder ist das ein Netzlaufwerk oder ein CDROM-Laufwerk?
  • welchen Sinn macht es denn für Dich, die Source-.mda-Dateien erst auf F: zu kopieren, dann in ein dortiges Zip zu quetschen und dann zu löschen?
  • Woher um Himmels willen können denn bei dieser Mimik deine so genannten dupes entstehen? Du legst doch für jede jede jede mda-datei auf Lw C: jedes mal ein neues Zip an.
  • und warum, wenn du schon 7Zip benutzt verwendest du das .zip-Format und glaubst, dass die 7-zip-Entwickler sich bei diesem Format mehr Mühe gegeben haben als beim Format ."7z".??

--> ich würde, wenn ich aus irgendwelchen Gründen kein richtiges Versionsverwaltungssystem wie SVN oder CVS benutzen mag
  • einen Refererent-"Source"-Stand auf dem %dest%-Laufwerk liegen lassen (jeweils die aktuellste version der .mda-Datei
  • im ersten Schritt mit "XCOPY /D und Schalter /L" alle Dateien anlisten lassen, die auf C: "neuer" als auf F:\ sind
  • diese Deltaliste a) als "Zip-des-Tages-mit-allen-geänderten Dateien" zippen und auf %dest% in ein Unterverzeichnis %dest%\MdaDeltas packen mit Datum als Präfix
  • diese Delta-Dateien auch 1:1 nach %dest% ins Referenz-MDA_Verzeichnis kopieren
  • am Ende nochmal mit FC vergleichen, ob auf auf C: und F: die gleichen mda's rum- bzw. vorliegen (sollte laut Konzept ja so sein)

Das würde dir zumindest ersparen, jede mda auf F: zu kopieren wie im bisherigen Konzept.

Wenn ich das falsch verstanden habe und auch heute bei dir bei meinetwegen 24 .mda-Dateien auf C: weniger als 24 .zip-Dateien auf F: entstehen, dann muss ich dein Skript wohl nochmal langsamer lesen...

Grüße
Biber
Bitte warten ..
Mitglied: D3ns007
03.11.2009 um 09:12 Uhr
Hier das Ergebnis der Quelltextoptimierung:

01.
 
02.
 
03.
@echo off & setlocal 
04.
 
05.
rem ************************* 
06.
rem Author: 
07.
rem Changes: 
08.
rem 09/11/02 
09.
rem ************************* 
10.
 
11.
set "source=SOURCE" 
12.
set "dest=DESTINATION" 
13.
set "ext=mda" 
14.
 
15.
rem Verschieben der Dateien nach ZIEL 
16.
rem move /y "%source%\*.%ext%" "%dest%" 
17.
 
18.
rem Verzeichnis wechseln, für jeden Tag ein Verzeichnis anlegen lassen 
19.
Pushd "%dest%" 
20.
	For /F "delims=" %%A in ('Dir /B/A-D "%source%\*.%ext%"') Do ( 
21.
		call :FolderIt "%%~fA" 
22.
23.
Popd 
24.
 
25.
goto ZipFolders 
26.
 
27.
Goto :EOF 
28.
 
29.
:FolderIt 
30.
Set "Folder=%~n1" 
31.
if not exist "%Folder:~0,9%" ( 
32.
	mkdir "%Folder:~0,9%" 
33.
34.
MOVE /Y %source%\%Folder%.mda %Folder:~0,9%\%Folder%.mda 
35.
goto :EOF 
36.
 
37.
 
38.
:ZipFolders 
39.
Pushd "%dest%" 
40.
	For /F "delims=" %%A in ('Dir /B/AD') Do ( 
41.
		call :ZipIt "%%~fA" 
42.
43.
Popd 
44.
goto :EOF 
45.
 
46.
 
47.
:ZipIt 
48.
Set "Zip=%~n1" 
49.
Set "Zip=%Zip%.zip" 
50.
"C:\Programme\7-Zip\7z.exe" u "%Zip%"  %1 -mx1 
51.
rmdir /Q /S %1 
52.
 
53.
:EOF

Vielleicht hilft der Code ja jemand anderes weiter.
Viele Grüße
und Danke für die Mühe
Bitte warten ..
Mitglied: Biber
03.11.2009 um 11:45 Uhr
Moin D3ns!007,

danke für das Bereitstellen deines Skripts.

Der Vollständigkeit halber die Frage:
Hat es dein ursprüngliches (Performance-) Problem auch gelindert?
Oder ist da kein Unterschied erkennbar?

Grüße
Biber
Bitte warten ..
Mitglied: D3ns007
03.11.2009 um 11:54 Uhr
Moin Biber,

ich hatte das ganze jeweil mit 36 Referen-Dateien getestet.
Bei dem bisherigen Script dauerte ein durchlauf ca. 3.40 min. Durch die optimierung sind wir auf ca. 29 sek. gekommen.
Das bringt natürlich einen großen Vorteil.
Am längsten dauert momentan der Kopiervorgang: Dateien von A nach B zu kopieren und das Updaten der mit 1500 Dateien recht großen Zip-Archiven.

Grüße
D3ns!007
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Batch zum bearbeiten mehrerer CSV (3)

Frage von Matzus87 zum Thema Batch & Shell ...

Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (21)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Windows Update
Treiberinstallation durch Windows Update läßt sich nicht verhindern (17)

Frage von liquidbase zum Thema Windows Update ...