Hallo inferior,
der Aufruf wie ich ihn dort mache, packt alle Dateien eines Ordner in ein Zip-File,
mfg (Auto)Bert
Hallo inferior,
der Aufruf wie ich ihn dort mache, packt alle Dateien eines Ordner in ein Zip-File,
mfg (Auto)Bert
hab im anderen post schon was dazu geschrieben.
Hallo inferior,
ich habe dort auch noch einmal editiert:
_FolderToZip("C:\Programme\AutoIt3\Deutsche Hilfe\")
[/autoit] [autoit][/autoit] [autoit]func _FolderToZip($spath)
;einziger Parameter der Pfad zu dem Ordner der gepackt werden soll mit abschliessenden \
$s_a_ToZip = _FileListToArray($sPath,"*")
for $i = 1 to $s_a_ToZip[0]
$s_a_ToZip[$i] = $sPath & $s_a_ToZip[$i]
Next
_BuildInZIP(StringTrimRight($sPath,1) & ".ZIP",$s_a_ToZip,False,1) ;func von BugFix aufrufen
EndFunc
Oder poste doch einfach einmal das aktuelle komplette Skript (ich habe den Thread nicht von Anfang an gelesen), dann baue ich dir das noch ein,
mfg (Auto)Bert
autoBert
also erst mal muss ich sagen, danke das du dich hier so beteiligst!
ich weiß jetzt worin der fehler liegt.
ich muss mein script in dem ordner starten in dem nicht nur die 7z.exe ist, sonder auch diese 7z.dll
dann funktioniert alles ordentlich. wirklich klasse!
eine möglichkeit ungebunden von den hilfs-dateien zu sein wird es warscheinlich nicht geben oder?
Doch, AutoBert hat recht. Die Funktion von BugFix kann auch ganze Verzeichnisse packen. Da habe ich mich geirrt (Sorry, BugFix).
Ich habe die Funktion mal in mein Beispiel eingebunden:
#include <File.au3>
$sPath = 'c:\beispiel\test\'
$sFile1 = 'datei1.txt'
$sFile2 = 'datei2.txt'
$aDirs = _FileListToArray($sPath, '*', 2) ; das Array $aDirs enthält die Namen der Unterverzeichnisse von $sPath
If Not @error Then
For $i = 1 To $aDirs[0] ; alle gefundenen Unterverzeichnisse durchgehen
If FileExists($sPath & $aDirs[$i] & '\' & $sFile1) Then FileCopy($sPath & $aDirs[$i] & '\' & $sFile1, @TempDir & '\' & $aDirs[$i] & '\', 9) ; wenn die Datei existiert nach TempDir kopieren
If FileExists($sPath & $aDirs[$i] & '\' & $sFile2) Then FileCopy($sPath & $aDirs[$i] & '\' & $sFile2, @TempDir & '\' & $aDirs[$i] & '\', 9) ; wenn die Datei existiert nach TempDir kopieren
If FileExists(@TempDir & '\' & $aDirs[$i]) Then _BuildInZIP(@TempDir & '\' & $aDirs[$i] & '.zip', @TempDir & '\' & $aDirs[$i] & '\')
Next
EndIf
;===============================================================================
; Function Name: _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=True, $iIndexBase=1, $fOverwrite=True)
; Description: Erstellt aus einer Datei od. einem Array von Dateien eine ZIP-Datei
; mit Hilfe der Windows eigenen ZIP-Funktion
; Parameter(s): $sPath Pfad der zu erstellenden ZIP-Datei // Bestehenden ZIP-Datei
; $s_a_ToZip String der Einzeldatei oder Array der zu zippenden Dateien
; // Pfad des Zielordners, in den entpackt werden soll
; $fUnZip=True Entpacken=True, Packen=False (Standard)
; $iIndexBase Index Basis (erstes Element mit Pfad) des übergebenen Arrays (0 od.1)
; $fOverwrite Falls $sPath existiert ==> Überschreiben (Standard=True)
; Return Value(s): Erfolg 1
; Fehler set @error 1 - Überschreiben aus, aber Zieldatei existiert
; 2 - Zieldatei endet nicht auf ".zip"
; 3 - zu komprimierende Datei existiert nicht
; @extended: Anzahl der fehlenden Dateien
; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
;===============================================================================
Func _BuildInZIP($sPath, $s_a_ToZip, $fUnZip=False, $iIndexBase=1, $fOverwrite=True)
Local $fh, $sNul = '', $sZIPHeader, $objShell = ObjCreate("Shell.Application"), $objZipOrdner, $err = 0
$sPath = FileGetLongName($sPath, 1)
If $fUnZip Then
Local $temp, $objZip
If Not FileExists($s_a_ToZip) Then DirCreate($s_a_ToZip)
$temp = $objShell.Namespace($s_a_ToZip)
$objZip = $objShell.Namespace($sPath)
$temp.CopyHere($objZip.Items)
Return 1
EndIf
If (Not $fOverwrite) And FileExists($sPath) Then Return SetError(1,0,0)
If StringRight($sPath, 4) <> '.zip' Then Return SetError(2,0,0)
For $i = 1 To 18
$sNul &= Chr(0)
Next
$sZIPHeader = Chr(80) & Chr(75) & Chr(5) & Chr(6) & $sNul
$fh = FileOpen($sPath, 10)
FileWrite($fh, $sZIPHeader)
FileClose($fh)
$objZipOrdner = $objShell.Namespace($sPath)
If Not IsArray($s_a_ToZip) Then
If Not FileExists($s_a_ToZip) Then Return SetError(3,1,0)
$objZipOrdner.CopyHere($s_a_ToZip)
Sleep(1000)
Return 1
EndIf
For $i = $iIndexBase To UBound($s_a_ToZip) -1
If Not FileExists($s_a_ToZip[$i]) Then
$err += 1
ContinueLoop
EndIf
$objZipOrdner.CopyHere($s_a_ToZip[$i])
Sleep(1000)
Next
If $err Then Return SetError(3,$err,0)
Return 1
EndFunc ;==>_BuildInZIP
So brauchst Du dann auch die 7z.dll und 7z.exe nicht mehr.
ich hab dein script angepasst
funktioniert bestens!
gefällt mir sehr gut ![]()
vielen vielen dank dafür!
hmm mir stellt sich die frage:
wenn die gezippten dateien im temp-ordner liegen
wie kann ich diese den wieder weiterverarbeiten?
also ich brauch ja den genauen datei-pfad
also: @DempDir & dateiname (der ja mal der ordnername des unbekannten teilpdades war & ".zip"
was muss ich für den ordnername verwenden? normal ist es doch $aDirs oder?
aber das geht nicht..
steh gerade bisschen auf dem schlauch..
Was willst Du denn mit den Archiven machen?
Das Array $aDirs enthält alle Unterordner von 'c:\beispiel\test\'. Kopiert und gepackt werden aber nur die, die auch die zwei Textdateien enthalten. Demzufolge könnte es sein, dass es einige Archive mit $aDirs[x] nicht gibt.
Je nachdem, was Du vorhast, würde es sich vielleicht anbieten, die ZIP-Archive in ein eigenes Array einlesen zu lassen.
also dieses script soll ein automatisches backup machen, ohne das ich lässtig die einzelnen dateien gerauspicken muss
das zippen ist um platz zu sparen.
ok ich glaub ich hab das mit dem array verstanden.
ich hab das ganze jetzt schon so geändert, dass die zip-dateien in einem extra ordner sind. also in @TempDir & "\Backup\"
man müsste also nur noch alle pfade
alle *.zip-dateien in dem ordner herausfinden und in eine variable speichern
wäre das möglich?
Meinst Du so:
[autoit]
#include <File.au3>
$aFiles = _FileListToArray(@TempDir & "\Backup", '*.zip', 1)
Alles anzeigenMeinst Du so:
[autoit][/autoit]
#include
$aFiles = _FileListToArray(@TempDir & "\Backup", '*.zip', 1)hab ich dann nicht alle pfade (bei mehreren *.zip-dateien)
habs mal getestet und anscheinend hat die variable $aFiles nur den wert 1 gespeichert O.oEDIT:
also hier ist das was ich anschließend machen möchte. nämlich die backup´s auf einen FTP hochzuladen:
[autoit]
#include <ftp.au3>
[/autoit] [autoit][/autoit] [autoit]$server = "servername"
[/autoit] [autoit][/autoit] [autoit]
$username = "username"
$pass = "xyz"$Open = _FTPOpen('MyFTP Control')
[/autoit]
$Conn = _FTPConnect($Open, $server, $username, $pass)
$Ftpp = _FtpPutFile($Conn, @TempDir & "\Backup\" & "???" & ".zip", "/Backup/" & "???" & ".zip")
$Ftpc = _FTPClose($Open)
Das ist keine normale Variable, sondern ein Array. Ich habe es Dir mal etwas anschaulicher dargestellt:
[autoit]
#include <File.au3>
#include <Array.au3>
$aFiles = _FileListToArray(@TempDir & "\Backup", '*.zip', 1)
For $i = 1 To $aFiles[0]
$aFiles[$i] = @TempDir & "\Backup\" & $aFiles[$i]
Next
_ArrayDisplay($aFiles)
Alles anzeigenDas ist keine normale Variable, sondern ein Array. Ich habe es Dir mal etwas anschaulicher dargestellt:
[autoit][/autoit]
#include
#include
$aFiles = _FileListToArray(@TempDir & "\Backup", '*.zip', 1)
For $i = 1 To $aFiles[0]
$aFiles[$i] = @TempDir & "\Backup\" & $aFiles[$i]
Next
_ArrayDisplay($aFiles)
==> Subscript used with non-Array variable.:
For $i = 1 To $aFiles[0]
For $i = 1 To $aFiles^ ERROR
>Exit code: 1 Time: 0.215
Du hast doch geschrieben, dass die ZIP-Archive jetzt in @TempDir & "\Backup" liegen, oder?
Der Fehler besagt nämlich, dass _FileListToArray nichts gefunden hat.
ändere so ab:
#Include <File.au3>
#Include <Array.au3>
$aFiles = _FileListToArray(@TempDir & "\Backup", '*.zip', 1)
if IsArray($aFiles) Then
For $i = 1 To $aFiles[0]
$aFiles[$i] = @TempDir & "\Backup\" & $aFiles[$i]
Next
_ArrayDisplay($aFiles)
Else
MsgBox(0,"Information","keine ZIPs gefunden")
EndIf
der Fehler tritt auf wenn keine ZIP-Files in @TempDir\Backup gefunden werden,
Edit: zu langsam
mfg (Auto)Bert
Wie wärs mit der Zip32 UDF?
Die funktioniert echt gut und die nehm ich auch immer...
also in diesem array befinden sich nun meine datei-pfade zu dem zip´s..
aber wie kann ich denn nun das hier einbinden?
ich weiß jetzt immer noch nicht wie ich die einzellnen pfade angeben kann..
#include <ftp.au3>
[/autoit][autoit][/autoit][autoit]$server = "servername"
$username = "username"
$pass = "xyz"
$Open = _FTPOpen('MyFTP Control')
$Conn = _FTPConnect($Open, $server, $username, $pass)
$Ftpp = _FtpPutFile($Conn, >>>>>>>>>zip-dateien<<<<<<<<<<")
$Ftpc = _FTPClose($Open)
Hallo inferior,
ich habe mich bis jetzt nur theoretisch mit FTP auseinandergesetzt, würde es aber so lösen:
#Include <File.au3>
;#Include <Array.au3>
#include <ftp.au3>
$server = "servername"
$username = "username"
$pass = "xyz"
$Open = _FTPOpen('MyFTP Control')
$Conn = _FTPConnect($Open, $server, $username, $pass)
$aFiles = _FileListToArray(@TempDir & "\Backup", '*.zip', 1)
if IsArray($aFiles) Then
For $i = 1 To $aFiles[0]
$aFiles[$i] = StringReplace(@TempDir & "\Backup\" & $aFiles[$i],"\","/") ;evtl. unnötig/schädlich
ConsoleWrite($aFiles[$i] & " wird tarnsferiert" & @CRLF)
$Ftpp = _FtpPutFile($Conn, $aFiles[$i])
Next
;_ArrayDisplay($aFiles)
Else
MsgBox(0,"Information","keine ZIPs gefunden")
EndIf
$Ftpc = _FTPClose($Open)
ich habe selbst aber keine Möglichkeit dies zu testen,
mfg (Auto)Bert
Alles anzeigenHallo inferior,
ich habe mich bis jetzt nur theoretisch mit FTP auseinandergesetzt, würde es aber so lösen:
Spoiler anzeigen
[autoit]#Include
[/autoit] [autoit][/autoit] [autoit]
;#Include
#include$server = "servername"
[/autoit] [autoit][/autoit] [autoit]
$username = "username"
$pass = "xyz"$Open = _FTPOpen('MyFTP Control')
[/autoit] [autoit][/autoit] [autoit][/autoit]
$Conn = _FTPConnect($Open, $server, $username, $pass)
$aFiles = _FileListToArray(@TempDir & "\Backup", '*.zip', 1)
if IsArray($aFiles) Then
For $i = 1 To $aFiles[0]
$aFiles[$i] = StringReplace(@TempDir & "\Backup\" & $aFiles[$i],"\","/") ;evtl. unnötig/schädlich
ConsoleWrite($aFiles[$i] & " wird tarnsferiert" & @CRLF)
$Ftpp = _FtpPutFile($Conn, $aFiles[$i])
Next
;_ArrayDisplay($aFiles)
Else
MsgBox(0,"Information","keine ZIPs gefunden")
EndIf
$Ftpc = _FTPClose($Open)ich habe selbst aber keine Möglichkeit dies zu testen,
mfg (Auto)Bert
also einen fehler hab ich darin entdeckt und zwar muss man bei $Ftpp = _FtpPutFile ein zielverueichnis und auch ein einen entgültigen dateinamen auf dem server angeben.
macht man dahinter nichts wie du, oder nur ," " dann funktioniert es nicht
hab das mal mit normalen pfade probiert
also sollte es
[autoit]
$Ftpp = _FtpPutFile($Conn, $aFiles[$i], "/Backup/" & $aFiles[$i])
heißen. was aber auch nicht funktioniert ![]()
EDIT: kann es auch nicht: denn $aFiles[$i] kann ich ja nicht für dem server verwenden, da dies ja der komplette datei-pfad ist
EDIT²: der fehler liegt andauern an der zeile wo mit hilfe von PUT die zip-dateien übertragen werden sollen.
==> Incorrect number of parameters in function call.:
$Ftpp = _FtpPutFile($Conn, $aFiles[$i])
$Ftpp = ^ ERROR
>Exit code: 1 Time: 0.611
kann es sein das die ftp file keine array´s oder sonstige unaufgelöste pfade zulässt?
werd das nochmal testen
wäre schön wenn das jemand wüsste
EDIT³:
in patch ist das ganze ja auch möglich
da hätte ich das so gelöst:
set "Basis=c:\beispiel\test\"
set "Datei1=a.txt"
set "Datei2=b.txt"
for /f "delims=" %%i in ('dir /s /b "%Basis%%Datei1%"') do call :ProcessDir "%%i"
goto next
:ProcessDir
set "Pfad=%~dp1"
call set "RelPfad=%%Pfad:%Basis%=%%"
xcopy /Q/Y "c:\beispiel\test\%RelPfad:~,-1%\%Datei1%" "%temp%\Backup\%RelPfad:~,-1%\"
xcopy /Q/Y "c:\beispiel\test\%RelPfad:~,-1%\%Datei2%" "%temp%\Backup\%RelPfad:~,-1%\"
zip32 "%temp%\Backup\%RelPfad:~,-1%" "%temp%\Backup\%RelPfad:~,-1%.zip"
ping -n 2 localhost >nul
echo OPEN servername>"%temp%\daten.ftp"
echo USER username>>"%temp%\daten.ftp"
echo xyz>>"%temp%\daten.ftp"
echo CD /Backup/>>"%temp%\daten.ftp"
echo BINARY>>"%temp%\daten.ftp"
echo DEBUG>>"%temp%\daten.ftp"
for %%i in (%temp%\Backup\*.zip) do echo PUT "%%i">>"%temp%\daten.ftp"
echo disconnect >> "%temp%\daten.ftp"
echo quit >> "%temp%\daten.ftp"
goto :eof
:next
ping -n 1 localhost >nul
ftp.exe -n -i -s:"%temp%\daten.ftp"
Alles anzeigen
Hallo inferior,
#Include <File.au3>
;#Include <Array.au3>
#include <ftp.au3>
$server = "servername"
$username = "username"
$pass = "xyz"
$Open = _FTPOpen('MyFTP Control')
$Conn = _FTPConnect($Open, $server, $username, $pass)
$aFiles = _FileListToArray(@TempDir & "\Backup", '*.zip', 1)
if IsArray($aFiles) Then
For $i = 1 To $aFiles[0]
$Source = @TempDir & "\Backup\" & $aFiles[$i]
$Dest = "ServerPfad/" & $aFiles[$i] ;hier anpassen
ConsoleWrite($Source & " wird nach " & $Dest & "kopiert" & @CRLF)
$Ftpp = _FtpPutFile($Conn, $Source,$Dest)
Next
;_ArrayDisplay($aFiles)
Else
MsgBox(0,"Information","keine ZIPs gefunden")
EndIf
$Ftpc = _FTPClose($Open)
die Logik stimmt, der Serverpfad muss auf jedenfallangepasst werden, der Sourcepath stimmt, ich selber habe auf meinem System noch nicht einmal die ftp.au3 und auch keine Hilfe dazu, ändere also evtl die Überschrift in Post #1, damit sich FTP-Spezialisten angesprochen fühlen
mfg (Auto)Bert