braindead
Goto Top

VB-Script zum zippen und anschließendem löschen der Ursprungsdatei mit Windowsboardmitteln in Win7 bzw Server 2008R2

Hallo,

ich möchte ein VB-Script erstellen, welches mir folgende Punkte erfüllt:
1. *.bak Dateien sollen in einen Unterordner gezippt werden
2. andere Dateitypen sollen unberührt bleiben
3. nur *.bak Dateien die älter als 7 Tage sind sollen gezippt werden
4. Urspungsdatei soll nach dem erfolgreichen Zip gelöscht werden
5. eine Protokolldatei soll angelegt werden
6. es soll mit Windowsboardmitteln gezippt werden, kein Winrar, 7-zip oder sonstiges

Ich habe leider wenig, sozusagen keine Erfahrung in Programmierung.

Ich habe mich bis jetzt durch folgende Erläuterungen gelesen aber komme damit nicht klar.

Zippen mittels VBS
Löschen von alten Dateien und Verzeichnissen per VBS mit Ausnahmen....

Ich habe auch einmal folgenden Teil eines Scripts auf meine 7-Tage gebracht:

myFolder = "C:\Neuer Ordner\"  
myZipFile = ("C:\Neuer Ordner\Zips" & (Date()&".zip"))  

counterFile = ("C:\Neuer Ordner\ZIPPEN am " & Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2) & ".txt") 'C:\Neuer Ordner\Zips  

Set objApp = CreateObject( "Shell.Application" )  
Set ObjFSO = CreateObject( "Scripting.FileSystemObject" )  
Set objcounterFile = objFSO.CreateTextFile(counterFile)

AltDatum = DateAdd("d", -7, Date)  

For Each objItem in objApp.NameSpace( myFolder ).Items
    If objItem.IsFolder Then
        ' Check if the subfolder is empty, and if  
        ' so, skip it to prevent an error message  
        Set objFolder = objFSO.GetFolder( objItem.Path )
        If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then
            intSkipped = intSkipped + 1

        Else
            Datum = objFSO.GetFolder(objItem.Path).DateLastModified
            'MsgBox ("Check U " & Datum) 'DateLastModified  
				
            If Datum < AltDatum Then 'alte Datei  
                objApp.NameSpace( myZipFile ).CopyHere objItem
                WScript.Echo "Alt U: " & Datum & " " & objItem.Name  
                objcounterFile.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count))  
                objcounterFile.Close				
                WScript.Sleep 1000
				intAlteVerz = intAlteVerz + 1
            Else
                WScript.Echo "Neu U: " & Datum & " " & objItem.Name  
            End If
				
        End If 
    Else
        Datum = objFSO.GetFile(objItem.Path).DateLastModified
        'MsgBox ("Check V " & Datum) 'DateLastModified  
				
        If Datum < AltDatum Then 'alte Datei  
            objApp.NameSpace( myZipFile ).CopyHere objItem
            WScript.Echo "Alt V: " & Datum & " " & objItem.Name  
            objcounterFile.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count))  
            objcounterFile.Close				
            WScript.Sleep 1000
			intAlteDatei = intAlteDatei + 1
        Else
            WScript.Echo "Neu V: " & Datum & " " & objItem.Name  
        End If
			
    End If
Next
'objFSO.CreateTextFile(counterFile).Write "Alte Verzeichnisse: " & intAlteVerz & vbTab & "Alte Dateien: " & intAlteDatei  

Dabei ist mein Ergebnis:

1. erhalte nur Popups über die Dateien die "Neu" sind, also weniger als 7 Tage
2. Es wird eine *.txt Datei erstellt die leer bleibt
3. es wird nichts gezippt
4. eine Fehlermeldung ab der Datei die älter als 7 Tage ist
Zeile: 41
Zeichen: 13
Fehler: Objekt erforderlich: 'objApp.NameSpace(...)'

Ich bedanke mich jetzt schon für die Hilfe und Unterstützung!
Bitte seid milde mit mir face-smile

Danke!

MfG
Braindead

Content-Key: 184811

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

Printed on: April 19, 2024 at 08:04 o'clock

Member: micneu
micneu May 10, 2012 at 19:02:29 (UTC)
Goto Top
warum muss es denn vb-script sein?
was ist mit powershell? würde dir auch eine lösung damit helfen?
Member: Braindead
Braindead May 11, 2012 at 05:44:52 (UTC)
Goto Top
Guten Morgen zusammen,

ja das würde mir natürlich genauso weiterhelfen, wenn sich damit alles realisieren lässt. Leider habe ich davon auch keine großen Kenntnisse.
Habe mich halt nur durch VB-Script etwas durchgelesen und da nach Lösungen gesucht.

Vielen dank schon einmal für die Rückmeldung.

MfG
Member: Braindead
Braindead May 14, 2012 at 09:00:33 (UTC)
Goto Top
Hallo,

leider niemand mehr dabei mir etwas unter die Arme zu greifen?

Vielen Dank!
Member: bastla
bastla May 17, 2012 at 21:04:49 (UTC)
Goto Top
Hallo Braindead!

Unter der Annahme, dass nur eine Ordnerebene untersucht werden muss, könntest Du es etwa so versuchen:
myFolder = "C:\Neuer Ordner\"  
myZipFile = myFolder & "\Zips" & Date & ".zip"  
Ext = "bak" 'Kleinbuchstaben verwenden  
Alter = 7

CounterFile = myFolder & "\ZIPEN am " & Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2) & ".txt"  

Set objApp = CreateObject("Shell.Application")  
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objCounterFile = objFSO.CreateTextFile(counterFile)

objFSO.CreateTextFile(myZIPFile).Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0)) 'ZIP-Datei erstellen  

AltDatum = DateAdd("d", -Alter, Date)  

For Each objFile In objFSO.GetFolder(myFolder).Files
    strFileName = objFile.Name
   	If LCase(objFSO.GetExtensionName(strFileName)) = Ext Then
        Datum = objFile.DateLastModified
        If Datum < AltDatum Then 'alte Datei  
            objApp.NameSpace(myZipFile).CopyHere objFile.Path
            WScript.Echo "Alt: " & Datum & " " & strFileName  
            objCounterFile.WriteLine "Gezippt: " & Datum & " " & strFileName  
            intAlteDatei = intAlteDatei + 1
            'warten, bis Datei in ZIP geschrieben wurde  
            Do Until objApp.Namespace(myZIPFile).Items.Count = intAlteDatei 
                WScript.Sleep 100
            Loop
            objFile.Delete 'Datei löschen  
        Else
            WScript.Echo "Neu: " & Datum & " " & strFileName  
        End If
    End If
Next
objCounterFile.WriteLine "Dateien gezipt: " & intAlteDatei  
Starten (wegen der Bildschirmausgaben) aus einer CMD-Shell per "cscript //nologo Scriptname.vbs" (oder nach dem Testen die Zeilen 22, 30 und 31 auskommentieren) ...

Bitte beachten: Die alten Dateien werden kommentarlos gelöscht (siehe Zeile 29)!

Grüße
bastla
Member: Braindead
Braindead May 25, 2012 at 08:19:43 (UTC)
Goto Top
Hallo,
entschuldige das ich das jetzt erst wieder aufgreife.

Ich war aus gesundheitlichen Gründen verhindert face-smile
Also es sieht im Moment so aus, dass ich eine Zip-datei erhalte, allerdings diese ohne Inhalt bleibt und die Dateien werden auch nicht gelöscht.

Ist eine Datei auch älter, als die hier im Beispiel genannten 7 Tage, erhalte ich eine Fehlermeldung:

Zeile: 21
Zeichen: 13
Fehler: Objekt erforderlich: 'objApp.NameSpace(...)'

Ja Du hattest recht mit Deiner Annahme, das nur eine Ordnerebene untersucht wird.

Ich danke Dir weiterhin für Deine Unterstützung.

Vielen Dank!

MfG
Braindead
Member: bastla
bastla May 25, 2012 updated at 09:49:13 (UTC)
Goto Top
Hallo Braindead!
eine Zip-datei erhalte, allerdings diese ohne Inhalt bleibt und die Dateien werden auch nicht gelöscht.
Ergibt sich beides logisch aus der Tatsache, dass eine leere ZIP-Datei vorweg erstellt wird (bzw werden muss), und das Zippen der alten Dateien in Zeile 21 fehlschlägt, wodurch das Script abbricht ...

... was allerdings bei meinem Test (mit dem von hier heruntergeladenen Scriptcode und als einziger Änderung der Anpassung des Pfades in Zeile 1) nicht passiert.

Hast Du den Code ebenfalls kopiert?

Grüße
bastla
Member: Braindead
Braindead May 25, 2012 updated at 09:06:21 (UTC)
Goto Top
Hallo,

ja ich habe den Code komplett kopiert.
DIe Anpassung in Zeile 1 getätigt und dann noch die Tage auf 22 geschraubt, da ich eine *.bak habe die 22 und eine die 23 tage alt ist. Dann ein Kommandozeilefenster als Administrator gestartet und das Script aufgerufen.

Es entsteht die zip mit dem Datum von heute, ohne Inhalt.
Member: bastla
bastla May 25, 2012 updated at 09:54:59 (UTC)
Goto Top
Hallo Braindead!

Gibt's auch immer noch die angesprochene Fehlermeldung? Diese würde bedeuten, dass "objApp" nicht vorhanden wäre (was aber, wenn am Beginn der Zeile 8 das "Set" steht, der Fall sein müsste) ...

... strange jedenfalls, das Ganze ...
Solange Du nur testest, könntest Du die Zeile 29 "entschärfen":
'objFile.Delete 'Datei löschen
- so kannst Du mit verschiedenen Tagesanzahlen experimentieren (nimm versuchsweise doch nochmal zB nur 10 Tage), ohne dass ggf Dateien gelöscht würden ...


Grüße
bastla
Member: Braindead
Braindead May 25, 2012 at 10:28:03 (UTC)
Goto Top
Hallo,

also ich habe Zeile 29 mit ' ausgeklammert.
Habe jetzt *.bak Dateien, die bis zu 23 Tage alt sind, in dem Ordner C:\Neuer Ordner.
Wenn ich nun das Script wieder über ein Kommandofenster als Administrator ausführe, wird ein Ordner mit dem namen "Zips25.05.1012" und eine Datei mit dem namen Zippen am "2012-05.25.txt" angelegt. Der Zip Ordner bleibt leer und die Textdatei ist auch ohne Inhalt.

Ich habe leider immer noch die Fehlermeldung wie oben.
Warum ich nun eine fehlermeldung erhalte und Du nicht bleibt mir ein Rätsel face-sad

Vielen Dank auf jeden Fall!!!

MfG
Braindead
Member: bastla
bastla May 25, 2012 at 12:44:31 (UTC)
Goto Top
Hallo Braindead!

Versuch es einmal mit folgender Zeile 2:
myZipFile = myFolder & "Zips" & Date & ".zip"
Dabei ist zu beachten, dass der Pfad in Zeile 1 mit einem "\" enden muss!

Grüße
bastla
Member: micneu
micneu May 25, 2012 updated at 14:17:45 (UTC)
Goto Top
also hier mein erster ansatz in powershell.
es wird noch keine log-datei erstellt und noch nicht der komplette pfad in der zipdatei erstellt.

#   **************************************************************
#    einmal auf der powershell ausgeführt werden
#     "Set-ExecutionPolicy Unrestricted" 
#   **************************************************************
#    zip funktionen von  
#    http:{{comment_single_line_double_slash:0}}
#   
#   **************************************************************
#   * Erstellt M.N. - POWERSHELL / Entwicklung   25.05.2012      *
#   **************************************************************
# variablen
$quelle = "C:\Dokumente und Einstellungen\m.neumann\Eigene Dateien\Eigene Bilder"  
$endung = "*.jpg"  
$TAGEABZUG=7
$ZIPDATUM=$((Get-Date) + (New-TimeSpan -days -$TAGEABZUG))
$ZIPFILE = "c:\$(Get-Date $ZIPDATUM -uformat "%Y-%m-%d").zip"  
$file = @(Get-ChildItem $quelle -filter $endung -recurse | Where-Object {$_.lastwritetime -le (Get-Date $ZIPDATUM)})
$filezip = $file #| select -first 1
$filename = $filezip | Select-Object Name
#echo $filename
$filenamefull = $filezip.fullName
Get-Date $ZIPDATUM -uformat "%Y-%m-%d"  
new-zip $ZIPFILE
foreach ($i in $file) {
    $filename = $i | Select-Object Name
    echo $i.fullName
    dir $i.fullName | Add-Zip $ZIPFILE
    }



function New-Zip
{
	param([string]$zipfilename)
	set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))  
	(dir $zipfilename).IsReadOnly = $false
}
## usage: new-zip c:\demo\myzip.zip

function Add-Zip
{
	param([string]$zipfilename)

	if(-not (test-path($zipfilename)))
	{
		set-content $zipfilename ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18))  
		(dir $zipfilename).IsReadOnly = $false	
	}
	
	$shellApplication = new-object -com shell.application
	$zipPackage = $shellApplication.NameSpace($zipfilename)
	
	foreach($file in $input) 
	{ 
            $zipPackage.CopyHere($file.FullName)
            Start-sleep -milliseconds 500
	}
}

## usage: dir c:\demo\files\*.* -Recurse | add-Zip c:\demo\myzip.zip

function Get-Zip
{
	param([string]$zipfilename)
	if(test-path($zipfilename))
	{
		$shellApplication = new-object -com shell.application
		$zipPackage = $shellApplication.NameSpace($zipfilename)
		$zipPackage.Items() | Select Path
	}
}
## usage: Get-Zip c:\demo\myzip.zip

function Extract-Zip
{
	param([string]$zipfilename, [string] $destination)

	if(test-path($zipfilename))
	{	
		$shellApplication = new-object -com shell.application
		$zipPackage = $shellApplication.NameSpace($zipfilename)
		$destinationFolder = $shellApplication.NameSpace($destination)
		$destinationFolder.CopyHere($zipPackage.Items())
	}
}
## usage: extract-zip c:\demo\myzip.zip c:\demo\destination
Member: Braindead
Braindead May 26, 2012 at 11:49:50 (UTC)
Goto Top
Hallo,

erst einmal Danke euch beiden. Ich werde vermutlich erst wieder Dienstag zum testen und ausprobieren kommen.
Ist halt langes Wochenende face-smile
Sobald ich Dienstag vielleicht auch Montag dazu gekommen bin werde ich euch rückmeldung geben!

Vielen Dank und auch ein schönes langes Wochenende!
Das Wetter ist ja z.Z. bei uns Bombe face-wink

MfG
Braindead
Member: Braindead
Braindead May 29, 2012 at 11:59:14 (UTC)
Goto Top
Hallo,

@all erst einmal hoffe ich das Wochenende wurde in der Sonne genossen face-smile

@ bastla
Ich habe die Änderungen wie geschrieben von Dir in den Code angepasst.
Es läuft alles wunderbar!!!
Es wurden in meinem Bsp. die Dateien die älter sind als 10 Tage gezippt. Dir Logdatei entsteht auch, alles wunderbar face-smile
Ich bedanke mich vielmals!!!

@micneu
Ich habe in Powershell noch nicht ausprobiert, hoffe aber das gleich oder die Tage noch damit zu testen und schaue was ich davon lerne und inwiefern ich damit klarkomme.
Ich danke Dir auf jeden Fall auch vielmals!!!

MfG Braindead
Member: bastla
bastla May 29, 2012 at 12:04:07 (UTC)
Goto Top
Hallo Braindead!

Freut mich, dass es so passt face-smile (mir wäre ansonsten auch nix mehr eingefallen) ...

Grüße
bastla
Member: Braindead
Braindead May 29, 2012 at 13:19:05 (UTC)
Goto Top
Hallo bastla,

soweit so gut. Ich würde das ganze nun noch anpassen. Da mir die Popups doch etwas nervig waren habe ich die ausgeklammert.
Die gezippten Dateien sollen nun in einem Unterordner landen. Passiert bei meiner Anpassung auch.
Mit dem löschen der Ursprungsdatei funktioniert auch wunderbar.(hab ich aber auch wieder ausgeklammert)
Nun möchte ich aber das in dem Unterordner ein weiterer Unterordner mit dem Tagesdatum entsteht und in diesem dann die Dateien jeweils einzelnt gezippt und nicht alle *.bak" Dateien in einem Zip.
Ist diese Anpassung möglich? Meines wissens wäre dies jetzt in der For Schleife anzusiedeln, oder ist der ganze Code jetzt fürn... face-smile
myFolder = "C:\Neuer Ordner\"  
myZipFile = "C:\Neuer Ordner\Sicherung\" & "Zips" & Date & ".zip"  
Ext = "bak" 'Kleinbuchstaben verwenden  
Alter = 2

CounterFile = "C:\Neuer Ordner\Sicherung\" & "\ZIPPEN am " & Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2) & ".txt"  

Set objApp = CreateObject("Shell.Application")  
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objCounterFile = objFSO.CreateTextFile(counterFile)

objFSO.CreateTextFile(myZIPFile).Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0)) 'ZIP-Datei erstellen  

AltDatum = DateAdd("d", -Alter, Date)  

For Each objFile In objFSO.GetFolder(myFolder).Files
    strFileName = objFile.Name
   	If LCase(objFSO.GetExtensionName(strFileName)) = Ext Then
        Datum = objFile.DateLastModified
        If Datum < AltDatum Then 'alte Datei  
            objApp.NameSpace(myZipFile).CopyHere objFile.Path
            'WScript.Echo "Alt: " & Datum & " " & strFileName'  
            objCounterFile.WriteLine "Gezippt: " & Datum & " " & strFileName  
            intAlteDatei = intAlteDatei + 1
            'warten, bis Datei in ZIP geschrieben wurde  
            Do Until objApp.Namespace(myZIPFile).Items.Count = intAlteDatei 
                WScript.Sleep 100
            Loop
            'objFile.Delete 'Datei löschen'  
        Else
            'WScript.Echo "Neu: " & Datum & " " & strFileName'  
        End If
    End If
Next
objCounterFile.WriteLine "Dateien gezippt: " & intAlteDatei  

Danke!

MfG
Braindead
Member: bastla
bastla May 29, 2012 at 16:23:11 (UTC)
Goto Top
Hallo Braindead!

Ungetestet:
myFolder = "C:\Neuer Ordner\"  
myZipFolder = "C:\Neuer Ordner\Sicherung\"  
Ext = "bak" 'Kleinbuchstaben verwenden  
Alter = 2

CounterFile = "C:\Neuer Ordner\Sicherung\" & "\ZIPPEN am " & Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2) & ".txt"  

Set objApp = CreateObject("Shell.Application")  
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objCounterFile = objFSO.CreateTextFile(counterFile)

AltDatum = DateAdd("d", -Alter, Date)  

For Each objFile In objFSO.GetFolder(myFolder).Files
    strFileName = objFile.Name
    If LCase(objFSO.GetExtensionName(strFileName)) = Ext Then
        Datum = objFile.DateLastModified
        If Datum < AltDatum Then 'alte Datei  
            'Name des ZIP-Files auf Basis des Originaldateinamens bilden  
            myZipFile = myZipFolder & objFSO.GetBaseName(strFileName)& Date & ".zip"  
            objFSO.CreateTextFile(myZIPFile).Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0)) 'ZIP-Datei erstellen  
            objApp.NameSpace(myZipFile).CopyHere objFile.Path
            'WScript.Echo "Alt: " & Datum & " " & strFileName'  
            objCounterFile.WriteLine "Gezippt: " & Datum & " " & strFileName  
            intAlteDatei = intAlteDatei + 1
            'warten, bis Datei in ZIP geschrieben wurde  
            Do Until objApp.Namespace(myZIPFile).Items.Count = 1 'nur eine Datei im ZIP-File  
                WScript.Sleep 100
            Loop
            'objFile.Delete 'Datei löschen'  
        Else
            'WScript.Echo "Neu: " & Datum & " " & strFileName'  
        End If
    End If
Next
objCounterFile.WriteLine "Dateien gezippt: " & intAlteDatei  
Da mir die Popups doch etwas nervig waren habe ich die ausgeklammert.
Um mich mal selbst zu zitieren:
Starten (wegen der Bildschirmausgaben) aus einer CMD-Shell per "cscript //nologo Scriptname.vbs"
Grüße
bastla
Member: Braindead
Braindead May 30, 2012 at 07:41:59 (UTC)
Goto Top
Guten Morgen,

gutes Selbstzitat :-P
Hab ich anscheinend überlesen. Geistige Umnachtung meinerseits!
Entschuldige!

Also es werden nun die Dateien einzelnd gezippt. Es wird allerdings kein weiterer Unterordner angelegt mit dem aktuellen Datum.
Ich habe mir daher ein paar Spielereien mit erstellen von Ordnern mit aktuellem Datum angeschaut und bin auf folgendem Code gestoßen

Dim objFileSystem 
Dim objShell 
Dim szOrdner 
Dim szRegKey 
 
WScript.Sleep 500 
 
Set objFileSystem = CreateObject("Scripting.FileSystemObject")   
Set objShell = CreateObject("Wscript.Shell")   
 
' Ordner: Jahr-Monat   
szOrdner = "O:\" & Right(Date,4) & "-" & Left(Date, 2)   
If Not (objFileSystem.FolderExists(szOrdner)) Then objFileSystem.CreateFolder( _
  szOrdner) 
 
' Unterordner: Tag   
szOrdner = szOrdner & "\" & Mid(Date, 4, 2)   
If Not (objFileSystem.FolderExists(szOrdner)) Then objFileSystem.CreateFolder( _
  szOrdner) 
 
SzRegKey = "HKEY_CURRENT_USER\Software\HeadLight\GetRight\Config\DefaultDir"  
ObjShell.RegWrite szRegKey,szOrdner 

Diesen habe ich noch wie folgt angepasst:
Dim objFileSystem 
Dim objShell 
Dim szOrdner 
 
WScript.Sleep 500 
 
Set objFileSystem = CreateObject("Scripting.FileSystemObject")   
Set objShell = CreateObject("Wscript.Shell")   
 
' Ordner: Jahr   
szOrdner = "C:\Neuer Ordner\Sicherung\" & Right(Date,4)   
If Not (objFileSystem.FolderExists(szOrdner)) Then objFileSystem.CreateFolder( _
  szOrdner) 
 
' Unterordner: Monat-Tag   
szOrdner = szOrdner & "\" & Mid(Date, 4, 2) & "-" & Left(Date, 2)   
If Not (objFileSystem.FolderExists(szOrdner)) Then objFileSystem.CreateFolder( _
  szOrdner) 
Damit die Datumsangaben passen und was das mit der Registry zu tun hat ist mir auch ein Rätsel face-smile

Ich habe dann diesen Codeschnipsel wie folgt eingebaut:
myFolder = "C:\Neuer Ordner\"  
myZipFolder = "C:\Neuer Ordner\Sicherung\"  
Ext = "bak" 'Kleinbuchstaben verwenden  
Alter = 5
Dim objFileSystem 
Dim objShell 
Dim szOrdner

CounterFile = "C:\Neuer Ordner\Sicherung\" & "\ZIPPEN am " & Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2) & ".txt"  

Set objApp = CreateObject("Shell.Application")  
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objCounterFile = objFSO.CreateTextFile(counterFile)
Set objFileSystem = CreateObject("Scripting.FileSystemObject")   
Set objShell = CreateObject("Wscript.Shell")   
 
' Ordner: Jahr   
szOrdner = "C:\Neuer Ordner\Sicherung\" & Right(Date,4)   
If Not (objFileSystem.FolderExists(szOrdner)) Then objFileSystem.CreateFolder( _
  szOrdner) 
 
' Unterordner: Monat-Tag   
szOrdner = szOrdner & "\" & Mid(Date, 4, 2) & "-" & Left(Date, 2)   
If Not (objFileSystem.FolderExists(szOrdner)) Then objFileSystem.CreateFolder( _
  szOrdner) 

AltDatum = DateAdd("d", -Alter, Date)  

For Each objFile In objFSO.GetFolder(myFolder).Files
    strFileName = objFile.Name
    If LCase(objFSO.GetExtensionName(strFileName)) = Ext Then
        Datum = objFile.DateLastModified
        If Datum < AltDatum Then 'alte Datei  
            'Name des ZIP-Files auf Basis des Originaldateinamens bilden  
            myZipFile = "myZipFolder\szOrdner" & objFSO.GetBaseName(strFileName) & ".zip"  
            objFSO.CreateTextFile(myZIPFile).Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0)) 'ZIP-Datei erstellen  
            objApp.NameSpace(myZipFile).CopyHere objFile.Path
            'WScript.Echo "Alt: " & Datum & " " & strFileName'  
            objCounterFile.WriteLine "Gezippt: " & Datum & " " & strFileName  
            intAlteDatei = intAlteDatei + 1
            'warten, bis Datei in ZIP geschrieben wurde  
            Do Until objApp.Namespace(myZIPFile).Items.Count = 1 'nur eine Datei im ZIP-File  
                WScript.Sleep 100
            Loop
            'objFile.Delete 'Datei löschen'  
        Else
            'WScript.Echo "Neu: " & Datum & " " & strFileName'  
        End If
    End If
Next
objCounterFile.WriteLine "Dateien gezippt: " & intAlteDatei  

Mein Problem ist nun, dass ich zwar Unterordner erhalte, aber der Zipteil komplett wegfällt.
Denke mal in Zeile 35 ist der Fehler. Vielleicht habe ich auch kompletten Mist gebaut face-smile
Wäre wieder für Deine Hilfe sehr dankbar!!! Ich hoffe es ist Ok wenn ich an Deinem Code so rumbastel. face-confused

MfG Braindead
Member: bastla
bastla May 30, 2012 updated at 09:25:55 (UTC)
Goto Top
Hallo Braindead!

Dann bastle ich zur Strafe auch an Deinem Code herum face-wink:
myFolder = "C:\Neuer Ordner\"  
myZipFolder = "C:\Neuer Ordner\Sicherung\" 'besser: myFolder & "Sicherung\"  
Ext = "bak" 'Kleinbuchstaben verwenden  
Alter = 5
CounterFile = myZIPFolder & "\ZIPPEN am " & Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2) & ".txt"  

Set objApp = CreateObject("Shell.Application")  
Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objShell = CreateObject("Wscript.Shell")   

Set objCounterFile = objFSO.CreateTextFile(counterFile)

 
' Ordner: Jahr   
myZIPYearFolder = myZipFolder & Year(Date)
If Not objFSO.FolderExists(myZIPYearFolder) Then objFSO.CreateFolder(myZIPYearFolder) 
 
' Unterordner: Monat-Tag   
myZIPDayFolder = myZIPYearFolder & "\" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2)  
If Not (objFSO.FolderExists(myZIPDayFolder)) Then objFSO.CreateFolder(myZIPDayFolder) 

AltDatum = DateAdd("d", -Alter, Date)  

For Each objFile In objFSO.GetFolder(myFolder).Files
    strFileName = objFile.Name
    If LCase(objFSO.GetExtensionName(strFileName)) = Ext Then
        Datum = objFile.DateLastModified
        If Datum < AltDatum Then 'alte Datei  
            'Name des ZIP-Files auf Basis des Originaldateinamens bilden  
            myZipFile = myZIPDayFolder & objFSO.GetBaseName(strFileName) & ".zip"  
            objFSO.CreateTextFile(myZIPFile).Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0)) 'ZIP-Datei erstellen  
            objApp.NameSpace(myZipFile).CopyHere objFile.Path
            'WScript.Echo "Alt: " & Datum & " " & strFileName'  
            objCounterFile.WriteLine "Gezippt: " & Datum & " " & strFileName  
            intAlteDatei = intAlteDatei + 1
            'warten, bis Datei in ZIP geschrieben wurde  
            Do Until objApp.Namespace(myZIPFile).Items.Count = 1 'nur eine Datei im ZIP-File  
                WScript.Sleep 100
            Loop
            'objFile.Delete 'Datei löschen'  
        Else
            'WScript.Echo "Neu: " & Datum & " " & strFileName'  
        End If
    End If
Next
objCounterFile.WriteLine "Dateien gezippt: " & intAlteDatei  
Anmerkungen:
Zu "Dim": Entweder alle vorkommenden Variablen deklarieren und als erste Zeile
Option Explicit
verwenden (damit es auffällt, wenn es eine nichtdeklarierte Variable - zB wegen eines Tippfehlers - gibt) oder gar keine Deklarationen vornehmen ...
Es genügt ein einziges "FileSystemObject".
Eine Stringzerlegung von "date" ist zwar ev einfacher durchzuführen als die Tages- und Monatszahlen per Funktion zu ermitteln und mit führender Null zu versehen, funktioniert aber nur bei passenden Systemeinstellungen für die Datumsdarstellung - die Funktionen liefern immer die richtigen Werte.
Variablennamen wie "myZIPDayFolder" finde ich aussagekräftiger als "szOrdner".
Hinsichtlich der Frage nach der Registry: Es wurde in dem von Dir gefundenen Script der erstellte Pfad in der Registry gespeichert (siehe "RegWrite") ...

Grüße
bastla
Member: Braindead
Braindead May 30, 2012 at 10:55:53 (UTC)
Goto Top
Hallo,

gerade getestet und wir sind dem gewünschten Endergebnis ganz nah. face-smile

Leider hat er immer noch die Zip-Files nicht in den Ordner mit der "Monats-Tag-Angabe" angelegt, sondern in den Jahresordner.

Mit der Anpassung in Zeile 30:
myZipFile = myZIPDayFolder & "\" & objFSO.GetBaseName(strFileName) & ".zip"  
erledigt er dies nun.

Ich glaube damit habe ich erst einmal das was ich mir gewünscht habe. face-wink

Die Frage bzgl. am Code basteln ist doch in heutiger Zeit nicht ganz unrelevant. Urheberrecht als Schlagwort face-smile Allerdings weiß ich da nicht wie das mit §-en bei Code vereinbar ist face-smile

Ich denke damit ist der Thread nun wirklich als gelöst anzusehen.
Ich freu mich und konnte ein bisschen vom Code begreifen, wenn mir auch vieles ein Rätsel bleibt.

Hast Du Informatik studiert oder in Sachen VB alles selbst angelernt?
Ich habe in der Ausbildung Anw. sagen wir mal nicht gemocht face-big-smile

MfG
Braindead

PS: Großes Lob an Dich für die Zeit und den Schweiß den Du investiert hast, obwohl das wohl "Billigkram" für Dich war.
Member: bastla
bastla May 30, 2012 updated at 13:19:11 (UTC)
Goto Top
Hallo Braindead!

Was die rechtliche Situation angeht: Du darfst gerne den Code nutzen und natürlich verbessern - dass Du diese verbesserte Version dann auch anderen zu den gleichen Bedingungen zur Verfügung stellst, setze ich mal voraus ...
... wenn mir auch vieles ein Rätsel bleibt.
Bei Fragen einfach fragen. face-wink
Hast Du Informatik studiert oder in Sachen VB alles selbst angelernt?
Ja face-wink (etwas von beidem)

Grüße
bastla