okidoki
Goto Top

Packen und entpacken mit Boardmitteln (Batch makecab-expand)

Bin völlig ratlos und frustriert ...
Ich möchte gerne zwei Dateien packen und später wieder entpacken mit Windows Boardmitteln, da es auf verschiedenen Systemen laufen soll - keine Thirdparty!

Mein Ansatz funktioiniert zumindest beim Packen (so scheint es mir), allerdings entsteht beim Entpacken bei einer Datei von beiden nur Datenmüll, die zweite hingegen wird korrekt expandiert. Das kommt mir komisch und ich weiß nicht weiter. Vielleicht gibt es auch eine andere Möglichkeit des Packens und Entpackens - über Hilfe würde ich mich freuen!
PS: Meine Frage beruht auf diesem Beitrag: Archivierung mittels Batch auf File-Server

::Testumgebung
@echo off
:: Handhabung für makecab erzeugen
  >"container.ddf" ECHO .Option Explicit  
 >>"container.ddf" ECHO .Set CabinetNameTemplate=test.cab  
 >>"container.ddf" ECHO .Set CompressionType=MSZIP  
 >>"container.ddf" ECHO .Set UniqueFiles="OFF"  
 >>"container.ddf" ECHO .Set temp-ordner=on  
 >>"container.ddf" ECHO  "test_1.xlsx"  
 >>"container.ddf" ECHO  "test_2.xlsx"  

makecab.exe /f container.ddf
:: bereinigen
del setup.inf 
del setup.rpt
del container.ddf

move "disk1\*.*" ".\test.cab"  
rmdir disk1 disk2 /S/Q 

pause

:: Umgekehrter Weg: Cab soll entpackt werden
expand.exe test.cab -F:test_1.xlsx temp-ordner
expand.exe test.cab -F:test_2.xlsx temp-ordner

pause
exit

Content-ID: 221049

Url: https://administrator.de/forum/packen-und-entpacken-mit-boardmitteln-batch-makecab-expand-221049.html

Ausgedruckt am: 22.12.2024 um 18:12 Uhr

colinardo
colinardo 03.11.2013 um 16:59:47 Uhr
Goto Top
Hallo OKIDOKI,
wenn dir Powershell nichts ausmacht :
http://www.admin-source.de/BlogDeu/450/powershell-zip-ohne-module-oder- ...
Lässt sich alternativ auch im selben Schema mit VB-Script umsetzen ...

Grüße Uwe
rubberman
rubberman 03.11.2013 um 17:28:09 Uhr
Goto Top
Hallo OKIDOKI,

wo hast du denn das
>>"container.ddf" ECHO .Set temp-ordner=on
hergenommen?
Wenn du diese Zeile auskommentierst und ein Verzeichnis temp-ordner im Arbeitsverzeichnis existiert, sehe ich keinen Grund, warum es nicht funktionieren sollte.

Grüße
rubberman
OKIDOKI
OKIDOKI 03.11.2013 aktualisiert um 18:36:59 Uhr
Goto Top
Hallo rubbermann,

es wäre so schön, wenn es funktionieren würde, aber leider kommt dann die Meldung: "test.cab: Für eine CAB-Datei, die mehrere Dateien enthält, ist ein Zielverzeichnis erforderlich."

PS colinardo: Die zip-Variante hört sich gut an. Mein Problem ist aber, von VBS habe ich gar keine Ahnung. Jetzt stellt sich nämlich die Frage, wie ist es möglich die vbs im selben Verzeichnis auszuführen, wo auch die Dateien liegen. Dann wäre es ein relativer Pfad, der lässt sich so leider nicht angeben. Hast du dazu vielleicht eine Idee?

Dankeschön face-wink
rubberman
rubberman 03.11.2013 um 18:38:55 Uhr
Goto Top
Hallo OKIDOKI.

"test.cab: Für eine CAB-Datei, die mehrere Dateien enthält, ist ein Zielverzeichnis erforderlich."
Dann hast du eben kein Verzeichnis namens temp-ordner im Arbeitsverzeichnis, sonst gäbe es diese Meldung nicht.

Grüße
rubberman
OKIDOKI
OKIDOKI 03.11.2013 um 18:44:26 Uhr
Goto Top
Hallo rubbermann,

zunächst noch einmal zum Verzeichnis, da hast du recht. Allerdings, es klingt paradox. Die erste Datei wird wunderbar extrahiert, bei der zweiten hängt er sich auf...
Also, wie gehabt.

OKIDOKI
rubberman
rubberman 03.11.2013 um 18:54:58 Uhr
Goto Top
Hallo OKIDOKI,

kann ich nicht nachstellen.
Der Code entspricht, bis auf wenige Korrekturen, deinem.
::Testumgebung
@echo off
:: Handhabung für makecab erzeugen
  >"container.ddf" ECHO .Option Explicit  
 >>"container.ddf" ECHO .Set CabinetNameTemplate=test.cab  
 >>"container.ddf" ECHO .Set CompressionType=MSZIP  
 >>"container.ddf" ECHO .Set UniqueFiles="OFF"  
:: >>"container.ddf" ECHO .Set temp-ordner=on  
 >>"container.ddf" ECHO  "test_1.xlsx"  
 >>"container.ddf" ECHO  "test_2.xlsx"  

makecab.exe /f container.ddf
:: bereinigen
del setup.inf 
del setup.rpt
del container.ddf

move "disk1\*.*" ".\test.cab"  
:: rmdir disk1 disk2 /S/Q
rmdir disk1 /S /Q 

pause

:: Umgekehrter Weg: Cab soll entpackt werden
expand.exe test.cab -F:test_1.xlsx temp-ordner
expand.exe test.cab -F:test_2.xlsx temp-ordner

pause
:: exit
Die Dateien test_1.xlsx, test_2.xlsx und Verzeichnis temp-ordner existieren. Alles wird korrekt verarbeitet.

Grüße
rubberman
OKIDOKI
OKIDOKI 03.11.2013 um 19:57:50 Uhr
Goto Top
Hallo rubbermann,

du hast einerseits recht, dass es funktioniert - mit leeren Excel-Files. Meine sind je 1,9MB groß, da funktioniert es bei der zweiten einfach nicht mehr, sie wird nur zur Hälfte entpackt, dann bricht er ab - kannst du dir das erklären?

Gruß
OKIDOKI
rubberman
rubberman 03.11.2013 um 20:48:13 Uhr
Goto Top
Hallo OKIDOKI.

kannst du dir das erklären?
Jepp, kann ich. MAKECAB splitted die Daten in CAB Dateien zu 1,44 MB, wenn nicht anders angegeben. Nun lass mich mal fix die Doku lesen, da steht drin, was dagegen zu tun ist.
.Set MaxDiskSize=0 wenn ich nicht irre...

Grüße
rubberman
colinardo
colinardo 03.11.2013, aktualisiert am 04.11.2013 um 21:18:08 Uhr
Goto Top
Zitat von @OKIDOKI:
PS colinardo: Die zip-Variante hört sich gut an. Mein Problem ist aber, von VBS habe ich gar keine Ahnung. Jetzt stellt sich
nämlich die Frage, wie ist es möglich die vbs im selben Verzeichnis auszuführen, wo auch die Dateien liegen. Dann
wäre es ein relativer Pfad, der lässt sich so leider nicht angeben. Hast du dazu vielleicht eine Idee?
Kein Problem, habe dir mal folgendes Script gebaut mit dem du den Inhalt eines Ordners in ein Zip packen, und auch wieder extrahieren kannst.
action = WScript.Arguments(0)	

Select Case LCase(action)
	Case "add"  
		sZipPath = WScript.Arguments(1)
		sFolderPath = WScript.Arguments(2)
		AddZip sZipPath, sFolderPath
	Case "extract"  
		sZipPath = WScript.Arguments(1)
		sFolderPath = WScript.Arguments(2)
		ExtractZip sZipPath, sFolderPath
End Select

Sub AddZip (zipFile, sFolder)
    With CreateObject("Scripting.FileSystemObject")  
        zipFile = .GetAbsolutePathName(zipFile)
        sFolder = .GetAbsolutePathName(sFolder)
        With .CreateTextFile(zipFile, True)
            .Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, chr(0))
        End With
    End With

    With CreateObject("Shell.Application")  
        .NameSpace(zipFile).CopyHere .NameSpace(sFolder).Items
        Do Until .NameSpace(zipFile).Items.Count = .NameSpace(sFolder).Items.Count
            WScript.Sleep 500 
        Loop
    End With
End Sub

Sub ExtractZip (zipFile, sFolder)
    With CreateObject("Scripting.FileSystemObject")  
        zipFile = .GetAbsolutePathName(zipFile)
        sFolder = .GetAbsolutePathName(sFolder)
    End With

    With CreateObject("Shell.Application")  
        .NameSpace(sFolder).CopyHere .NameSpace(zipFile).Items, 16
        Do Until .NameSpace(sFolder).Items.Count = .NameSpace(zipFile).Items.Count
            WScript.Sleep 500
        Loop
    End With
End Sub
Du speicherst es dir z.B.als zip.vbs, und dann führst du folgende Zeilen in der Batch aus um den Inhalt eines Ordners zu komprimieren bzw. zu extrahieren:
back-to-topBeispiel: Inhalt eines Ordners komprimieren
cscript //B //NOLOGO zip.vbs add "C:\test.zip" "C:\source"
back-to-topBeispiel: Inhalt eines ZipFiles extrahieren
cscript //B //NOLOGO zip.vbs extract "C:\test.zip" "C:\target"
Hinweis: Du kannst auch relative Pfade angeben wie ".\source" angeben.

Grüße Uwe
OKIDOKI
OKIDOKI 03.11.2013 um 21:01:09 Uhr
Goto Top
Hallo rubbermann,
super, hat geklappt!!!

Eine Frage noch: Ein Passwort ist wohl nicht möglich...

Ansonsten ist der Thread geklärt,

vielen Dank rubbermann
OKIDOKI
OKIDOKI
OKIDOKI 03.11.2013 aktualisiert um 21:05:06 Uhr
Goto Top
Hallo colinardo,

das ist ja noch mal genauso super und ich werde es morgen gleich ausprobieren! (Insgesamt bin ich froh beide Varianten geklärt zu haben, im Netz werden sie nämlich heiß diskutiert und hier gibt es beide Lösungen!!!)

Eine Frage auch hierzu, colinardo: Ist hier ein Passwort möglich?

Vielen, vielen Dank,
Rückmeldung morgen!

OKIDOKI
rubberman
rubberman 03.11.2013 um 21:27:53 Uhr
Goto Top
Hallo OKIDOKI.

Ein Passwort ist wohl nicht möglich...
Nicht dass mir was bekannt wäre. In der Doku findet sich auch nichts dazu.

Grüße
rubberman
OKIDOKI
OKIDOKI 03.11.2013 um 21:31:44 Uhr
Goto Top
Hallo rubbermann,

das hatte ich mir schon gedacht, hatte auch nichts gefunden bisher face-wink

Ein RIESENDANKESCHÖN im weltbesten Forum,

OKIDOKI
colinardo
colinardo 03.11.2013 aktualisiert um 21:34:04 Uhr
Goto Top
Zitat von @OKIDOKI:
Eine Frage auch hierzu, colinardo: Ist hier ein Passwort möglich?
IMHO glaube ich nicht. Dazu müsste man mit VBS das ZIP-Format nachbauen... das wäre mal ne Aufgabe für lange Winterabende face-wink

Grüße Uwe
Bitboy
Bitboy 04.11.2013 um 10:46:52 Uhr
Goto Top
HI,

auch wenns inzwischen mit zip gelöst wurde wollte ich noch die Angaben für eine CAB Datei posten, die zumindest bei mir problemlos funktionieren:

.OPTION EXPLICIT
.Set CompressionType=MSZIP
.Set UniqueFiles="OFF"
.Set Compress=on
.Set Cabinet=on
.Set CabinetFileCountThreshold=0
.Set FolderFileCountThreshold=0
.Set FolderSizeThreshold=0
.Set MaxCabinetSize=0
.Set MaxDiskFileCount=0
.Set MaxDiskSize=0
.Set DiskDirectoryTemplate=%AusgabeOrdnerDerCabDatei%
.Set CabinetNameTemplate=%DateiName%.cab
%Datei1%
%Datei2%
usw
OKIDOKI
OKIDOKI 04.11.2013 um 20:56:10 Uhr
Goto Top
Hi Bitboy,

vielen Dank für deine Mühe! Ich hätte noch die Bitte, kurz die Befehle zu kommentieren. Gerade auch die Angabe des Ausgabeordners wäre mir wichtig. Hier benötige ich einen relativen Pfad. Ist es dasselbe wie oben ".Set temp-ordner=on"?

OKIDOKI
OKIDOKI
OKIDOKI 04.11.2013 um 21:13:32 Uhr
Goto Top
Hallo Uwe,

soweit erst einmal vielen Dank. Vielleicht bin ich zu ungeduldig, wie genau sieht die batch-Zeile aus? Was hat es denn mit "cscript.vbs" auf sich?

Bei mit passiert leider nichts bisher beim Aufruf der Batch mit der angegebenen Zeile ... ;-(

OKIDOKI
colinardo
colinardo 04.11.2013 um 21:17:07 Uhr
Goto Top
Zitat von @OKIDOKI:
Bei mit passiert leider nichts bisher beim Aufruf der Batch mit der angegebenen Zeile ... ;-(
Sorry mein Fehler, hab mich vertippt... habs oben korrigiert ...
Grüße Uwe
OKIDOKI
OKIDOKI 04.11.2013 um 22:05:19 Uhr
Goto Top
Hallo Uwe,

tadellos - echt prima!

Für alle Code-Picker: Hier findet ihr die ultimativen Lösungen für das o.g. Problem - kein Forum, was ich fand, bot solche umfassenden und zielführenden Lösungen.

Vielen Dank noch einmal,
OKIDOKI

PS: Wer daran noch weiter arbeiten möchte, dem sei die Passwortsuche für lange Winterabende empfohlen (s.o.).
rubberman
rubberman 04.11.2013 aktualisiert um 22:10:01 Uhr
Goto Top
Hallo OKIDOKI.

Die Doku gibt's natürlich bei Microsoft (msdn.microsoft.com/en-us/library/bb417343.aspx#microsoftmakecabusersguide).

Ist es dasselbe wie oben ".Set temp-ordner=on"?
Wo hast du nur diese Zeile gefunden? Funktioniert sowas wirklich bei dir?

Ob du nun relative oder absolute Pfadangaben nutzt, kannst du dir aussuchen. Aus einem relativen Pfad ließe sich auch ruckzuck ein absoluter machen. In Variable %cd% findest du das derzeitige Arbeitsverzeichnis (ohne nachgestellten Backslash), während %~dp0 zum Verzeichnis aufgelöst wird, in dem die Batchdatei liegt (mit nachgestelltem Backslash).

Grüße
rubberman
OKIDOKI
OKIDOKI 05.11.2013 um 16:58:30 Uhr
Goto Top
Hallo rubbermann,

ich habe noch einmal meine Recherchen nachvollzogen und kann es ehrlich gesagt gar nicht mehr sagen ... komisch ;-|

Mit der Doku bin ich dir deshalb sehr dankbar, irgendwie ist alles da, wenn man weiß wo!

Wo hast du denn jetzt die Variable %cd% her? Ich würde das gerne nachstellen.

Grüße
OKIDOKI
rubberman
rubberman 05.11.2013 um 18:06:23 Uhr
Goto Top
Hallo OKIDOKI.

Wo hast du denn jetzt die Variable %cd% her?
Aus der Hilfe zum SET Befehl. Wie du schon sagtest:
irgendwie ist alles da, wenn man weiß wo!
face-wink
SET /?
[...]
%CD% - expandiert zum aktuellen Verzeichnisnamen.
[...]
Es ist eine dynamische Variable, die automatisch vom Kommandozeileninterpreter gesetzt wird.

Grüße
rubberman
OKIDOKI
OKIDOKI 06.11.2013 um 14:39:50 Uhr
Goto Top
Hallo rubbermann,

vieln Dank für deine Hinweise!

Gruß
OKIDOKI