84409
Goto Top

Zippen mittels VBS

Hallo zusammen, ich habe mal wieder eine Aufgabe, die ich ohne Eure Hilfe mit VB Script nicht gelöst bekomme:

Dateien (unterschiedliche Dateitypen) aus einem Ordner deren "LastModified" Datum eine gewisse Zeit zurück liegt (beispielsweise 3 Monate)
sollen gezippt werden. Diese ZIP Datei soll ebenfalls in einem anderen Ordner liegen als die Dateinen.

So weit bin ich schon mit zusammen geklauten VBS Schnipseln gekommen:

Option Explicit

Dim myFolder, myZipFile, arrResult 

myFolder = "C:\Test\"  
myZipFile = ("\\server\ARCHIV\" & (Date()&".zip"))  

arrResult = ZipFolder( myFolder, myZipFile )
'If arrResult(0) = 0 Then  
'    If arrResult(1) = 1 Then  
'        WScript.Echo "Done; 1 empty subfolder was skipped."  
'    Else  
'        WScript.Echo "Done; " & arrResult(1) & " empty subfolders were skipped."  
'    End If  
'Else  
'    WScript.Echo "ERROR " & Join( arrResult, vbCrLf )  
'End If  


Function ZipFolder( myFolder, myZipFile )

    Dim intSkipped, intSrcItems
    Dim objApp, objFolder, objFSO, objItem, objTxt, FileObj, CheckVerzeichnis, altesDatum
    Dim strSkipped

    Const ForWriting = 2

    intSkipped = 0

    ' Use custom error handling  
    On Error Resume Next

    ' Create an empty ZIP file  
    Set objFSO = CreateObject( "Scripting.FileSystemObject" )  
    Set objTxt = objFSO.OpenTextFile( myZipFile, ForWriting, True )
    objTxt.Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, Chr(0) )   '"PK" & Chr(5) & Chr(6) & String( 18, Chr(0) )  
    objTxt.Close
    Set objTxt = Nothing

    ' Abort on errors  
    If Err Then
        ZipFolder = Array( Err.Number, Err.Source, Err.Description )
        Err.Clear
        On Error Goto 0
        Exit Function
    End If
    
    ' Create a Shell object  
    Set objApp = CreateObject( "Shell.Application" )  
	Set FileObj = CreateObject("Scripting.FileSystemObject")  
	Set CheckVerzeichnis = FileObj.GetFolder( myFolder )
	
	'Set FSO = CreateObject( "Scripting.FileSystemObject" )  
	'Set oZDatei = FSO.OpenTextFile(counterFile, 2, True)   

    ' Copy the files to the compressed folder <- AB HIER WIRD DIE ZIP DATEI BEFÜLLT, DA MUSS MIT DEM DATUM GEARBEITET WERDEN, NUR WIE?  
    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
		objApp.NameSpace( myZipFile ).CopyHere objItem		
				WScript.Sleep 1000
				
            End If 
        Else
			
For Each datei In CheckVerzeichnis.Files
	'altesDatum = datei.DateCreated  
		MsgBox ("Datum: " & (datei.DateCreated))  
Next	

            objApp.NameSpace( myZipFile ).CopyHere objItem
			WScript.Sleep 1000
			
        End If
    Next


    Set objFolder = Nothing
    Set objFSO    = Nothing

    ' Abort on errors  
    If Err Then
        ZipFolder = Array( Err.Number, Err.Source, Err.Description )
        Set objApp = Nothing
        Err.Clear
        On Error Goto 0
        Exit Function
    End If

    ' Keep script waiting until compression is done  
    intSrcItems = objApp.NameSpace( myFolder  ).Items.Count
    Do Until objApp.NameSpace( myZipFile ).Items.Count + intSkipped = intSrcItems
        WScript.Sleep 1000
    Loop
    Set objApp = Nothing

    ' Abort on errors  
    If Err Then
        ZipFolder = Array( Err.Number, Err.Source, Err.Description )
        Err.Clear
        On Error Goto 0
        Exit Function
    End If

    ' Restore default error handling  
    On Error Goto 0

    ' Return message if empty subfolders were skipped  
    If intSkipped = 0 Then
        strSkipped = ""  
    Else
        strSkipped = "skipped empty subfolders"  
    End If

    ' Return code 0 (no error occurred)  
    ZipFolder = Array( 0, intSkipped, strSkipped )
	
End Function

Content-Key: 169246

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

Ausgedruckt am: 29.03.2024 um 00:03 Uhr

Mitglied: 84409
84409 06.07.2011 um 16:45:06 Uhr
Goto Top
Um genauer zu sein, geht es mir gerade erstmal um den Teil für's Debugging, wo mir das entsprechende Datum ausgegeben wird:

    ' Copy the files to the compressed folder  
    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 = CStr(objItem.DateLastModified)
				MsgBox ("Check U " & Datum) 'DateLastModified  
					'objApp.NameSpace( myZipFile ).CopyHere objItem ABSICHTLICH AUKOMMENTIERT, KOMMT SPÄTER WIEDER REIN  
Mitglied: bastla
bastla 06.07.2011 um 18:10:17 Uhr
Goto Top
Hallo sascha123!

Gerade hinsichtilch des Debuggings ein Tipp vorweg: Verwende anstelle von "MsgBox" die Ausgabe mit "WScript.Echo" - wenn Du das Script mit "wscript.exe" ausführen lässt, erhältst Du weiterhin eine MessageBox, aber beim Testen mit "cscript.exe" werden die Ausgaben (ohne jede einzelne bestätigen zu müssen) in die Konsole geschrieben ...
Deine (nicht genannte) Fehlermeldung für die Zeile 11 sollte "Object doesn't support this property or method: 'objItem.DateLastModified'" sein - verwende (wie oben in Deinem Script in den Zeilen 72 - 75 bereits angedeutet) das entsprechende "FileSystemObjekt", also etwa
Datum = objFSO.GetFile(objItem.Path).DateLastModified
Da bei der Ausgabe ohnehin das Timestamp-Format (Datum + Uhrzeit) verwendet wird, ist die Konvertierung in einen String nicht erforderlich.
Um das Alter der Datei vergleichen zu können, solltest Du (einmal) vorweg mittels eines "DateAdd()" die gewünschte Anzahl von Tagen / Monaten zurückrechnen und das Ergebnis mit dem ausgelesenen Datum vergleichen, also etwa:
Alt = DateAdd("m", -3, Date)  
...
If Datum < Alt Then 'alte Datei  
...

Grüße
bastla
Mitglied: 84409
84409 07.07.2011 um 10:09:18 Uhr
Goto Top
DANKE!!!!!!!!!!!!! Ja genau das war die Zeile, die ich gestern gebraucht habe:

Datum = objFSO.GetFile(objItem.Path).DateLastModified

Vielen Dank! Ich markiere den Beitrag extra noch nicht als gelösst, da ich vielleicht noch ein weiteres Mal mit dem Script Hilfe brauche.

Ich melde mich die Tage nochmal.

Beste Grüße
Mitglied: 84409
84409 07.07.2011 um 10:36:18 Uhr
Goto Top
Ich habe das ganze mal hier so umgesetzt (bis auf den Tipp mit der MsgBox, da war ich gerade etwas zu faul für):

        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.GetFile(objItem.Path).DateLastModified
				'MsgBox ("Check U " & Datum) 'DateLastModified  
				
				Alt = DateAdd("m", -3, Date)  
					If Datum < Alt Then 'alte Datei  
						'objApp.NameSpace( myZipFile ).CopyHere objItem  
						MsgBox "Alt U"  
						'oZDatei.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count))  
						'oZDatei.Close				  
						WScript.Sleep 1000
					Else
						MsgBox "Neu U"  
					End If
				
            End If 
			Else
				Datum = objFSO.GetFile(objItem.Path).DateLastModified
				'MsgBox ("Check V " & Datum) 'DateLastModified  
				
				Alt = DateAdd("m", -3, Date)  
					If Datum < Alt Then 'alte Datei  
						'objApp.NameSpace( myZipFile ).CopyHere objItem  
						MsgBox "Alt V"  
						'oZDatei.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count))  
						'oZDatei.Close				  
						WScript.Sleep 1000
					Else
						MsgBox "Neu V"  
					End If
			
        End If

Das Änderungsdatum (was ich auch testweise erfolgreich habe ausgeben lassen) ist der 05.07.2011, aber ich bekomme bei der Umsetzung oben immer die ausgabe "Alt V" beziehungsweise "Alt U".

Aber es müsste doch "Neu V" beziehungsweise "Neu U" sein?!?!?!

Habe ich die Zeile richtig verstanden:

Alt = DateAdd("m", -3, Date)   

Alt ist das jetzige Datum MINUS 3 Monate ("m")???

Danke und Grüße!
Mitglied: bastla
bastla 07.07.2011 um 10:53:19 Uhr
Goto Top
Hallo sascha123!

Mal abgesehen davon, dass Zeile 9 sich nicht auf eine Datei bezieht und daher
Datum = objFSO.GetFolder(objItem.Path).DateLastModified
lauten müsste: Bei meinem Test macht das Script, was es soll ...
Alt ist das jetzige Datum MINUS 3 Monate ("m")???
Genau das.
Noch zwei Anmerkungen:
Die Ermittlung von "Alt" würde ich, wie schon erwähnt, nur ein einziges Mal (und daher bereits vor der Schleife) durchführen.

Du brauchst nur ein einziges "FileSystemObject" zu erstellen (und das sinnvoller Weise auch gleich am Anfang des Scripts) - einmal "objFSO", dann wieder "FileObj" zu verwenden ist nicht zielführend ...

Grüße
bastla
Mitglied: 84409
84409 07.07.2011 um 12:16:05 Uhr
Goto Top
Hallo Bastla,

danke für deine Bemühungen, aber so ganz komme ich nicht weiter. Mir scheint es auch so, als hättest du das '<' Zeichen falscher herum angewendet?
Da muss meiner Meinung nach Datum KLEINER AltDatum rein damit das Ergebis stimmt/ Ziel erreicht wird?!

Aller egal wie rum, ich bekomme immer "Alt V" beziehungsweise "Alt U" ausgegeben...

Das doppelte "FileSystemObject" habe ich auch rausgenommen, danke für den Hinweis. Den Fehler in Zeile 9 (oben) habe ich auch korrigiert und das AltDatum wird auch vorher (vor der Schleife) definiert.

        If objItem.IsFolder Then

            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
				
					If Datum > AltDatum Then 'alte Datei  
						'objApp.NameSpace( myZipFile ).CopyHere objItem  
						'WScript.Sleep 1000  
						MsgBox "Alt U " & AltDatum  
		
					Else
						MsgBox "Neu U " & AltDatum  
					End If
				
            End If 
			Else
				Datum = objFSO.GetFile(objItem.Path).DateLastModified
				
					If Datum > AltDatum Then 'alte Datei  
						'objApp.NameSpace( myZipFile ).CopyHere objItem  
						'WScript.Sleep 1000  
						MsgBox "Alt V " & AltDatum  
			
					Else
						MsgBox "Neu V " & AltDatum  
					End If
			
        End If
Mitglied: bastla
bastla 07.07.2011 um 12:44:22 Uhr
Goto Top
Hallo sascha123!
Mir scheint es auch so, als hättest du das '<' Zeichen falscher herum angewendet?
Aufgrund der Tatsache, dass das Datum ja eigentlich ein Zahlenwert ist, hat ein früheres Datum einen niedrigeren Wert - wenn daher der Vergleich lautet:
If Datum < Alt Then
wird gefragt, ob "Datum" früher als "Alt" (und damit die Datei älter als das Vergleichsdatum - was dem bekannten Phänomen "auf den ältesten Fotos sieht man am jüngsten aus" entspricht face-wink) ist ...

Bei mir funktionier jedenfalls der folgende Schnipsel wunschgemäß:
myFolder ="D:\TEMP"  
Set objApp = CreateObject( "Shell.Application" )  
Set ObjFSO = CreateObject("Scripting.FileSystemObject")  
Set CheckVerzeichnis = ObjFSO.GetFolder( myFolder )

Alt = DateAdd("m", -3, 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 < Alt Then 'alte Datei  
                'objApp.NameSpace( myZipFile ).CopyHere objItem  
                WScript.Echo "Alt U: " & Datum & " " & objItem.Name  
                'oZDatei.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count))  
                'oZDatei.Close				  
                'WScript.Sleep 1000  
            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 < Alt Then 'alte Datei  
            'objApp.NameSpace( myZipFile ).CopyHere objItem  
            WScript.Echo "Alt V: " & Datum & " " & objItem.Name  
            'oZDatei.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count))  
            'oZDatei.Close				  
            'WScript.Sleep 1000  
        Else
            WScript.Echo "Neu V: " & Datum & " " & objItem.Name  
        End If
			
    End If
Next
Beim Testen starte ich aus einem CMD-Fenster mit
cscript //nologo C:\Scripts\Zippen.vbs
Grüße
bastla
Mitglied: 84409
84409 07.07.2011 um 16:44:12 Uhr
Goto Top
Cool. So weit läuft's!

Noch ne kurze Frage: Was ist mit der Variable: intSkipped? - Warum muss diese nicht deklariert werden?

Hast du noch die Motivation mir weiter zu helfen, dass die Anzahl der Betroffenen Dateien die alt oder älter sind in eine Textdatei geschrieben werden?

counterFile = (\"\\\\server\\ARCHIV\\ZIPPEN am \" & (Date()&\".txt\"))  
Mitglied: bastla
bastla 07.07.2011 um 17:03:54 Uhr
Goto Top
Hallo sascha123!
Was ist mit der Variable: intSkipped? - Warum muss diese nicht deklariert werden?
Es muss, solange Du nicht "Option Explicit" verwendest, keine Variable deklariert werden (dann aber alle) ...

Deine Zeile ist mir nicht ganz klar - falls es darum geht, einen Dateipfad mit dem aktuellen Datum zu erstellen, würde ich allerdings ohnehin zur Schreibweise "JJJJ-MM-TT" greifen und daher den Pfad etwa so erstellen (funktioniert unabhängig von den Datumseinstellungen des Systems):
counterFile = "\\server\ARCHIV\ZIPPEN am " & Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2) & ".txt"
Grüße
bastla
Mitglied: 84409
84409 07.07.2011 um 17:11:45 Uhr
Goto Top
Ah ok, guter Tipp.

Damit wäre die Datei erstellt face-wink

Hast vielleicht noch die ein oder andere Zeile für mich, wie ich dann die Anzahl der Dateien auf die alt oder älter zutrifft in diese erstellte txt Datei schreibe?

Beste Grüße und vielen Dank für deine schnelle Hilfe!!!!!
Mitglied: bastla
bastla 07.07.2011 um 17:30:46 Uhr
Goto Top
Hallos sascha123!

Du brauchst jeweils (für Dateien und Verzeichnisse getrennt) einen Zähler der Art
intAlteDatei = intAlteDatei + 1
den Du im "Then"-Zweig der Abfrage
If Datum < Alt Then
platzierst.

Nachdem alle Elemente abgearbeitet sind (also im Codeschnipsel oben ganz am Ende nach dem "Next") kennst Du dann die jeweiligen Gesamtwerte und kannst sie in die Datei schreiben ...

Grüße
bastla
Mitglied: 84409
84409 07.07.2011 um 17:53:36 Uhr
Goto Top
Ok, ein bisschen hatte ich mir das schon gedacht, das ich an der stelle dann für jede Datei einen Zähler hochsetzten muss.

Aber mir geht es eher um das in-die-Datei-schreiben face-wink
Da bräuchte ich die Codeschnipsel für, erstellt wird die Datei ja auch schon....

Danke und Grüße!!!
Mitglied: bastla
bastla 07.07.2011 um 18:00:39 Uhr
Goto Top
Hallo sascha123!

Das Erstellen und Schreiben würde ich (falls das Ergebnis in eine Zeile soll) kombinieren:
objFSO.CreateTextFile(counterFile).Write "Alte Verzeichnisse: " & intAlteVerz & vbTab & "Alte Dateien: " & intAlteDatei
Ansonsten eben:
Set objcounterFile = objFSO.CreateTextFile(counterFile)
objcounterFile WriteLine "Alte Verzeichnisse: " & intAlteVerz  
objcounterFile WriteLine "Alte Dateien: " & intAlteDatei  
objcounterFile.Close
Je nachdem, ob Du am Ende der Datei noch eine Zeilenschaltung willst, "Write" oder "WriteLine" für die Ausgabe der letzten Zeile verwenden ...

Grüße
bastla
Mitglied: 84409
84409 07.07.2011 um 18:18:22 Uhr
Goto Top
DANKE DANKE DANKE!

Aber ich bekomme dabei leider in der vorletzten Zeile den Fehler: "Erlaubnis verweigert".
Schon nach der ersten WScript.Echo-Ausgabe....

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			  
                '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			  
            'WScript.Sleep 1000  
			intAlteDatei = intAlteDatei + 1
        Else
            WScript.Echo "Neu V: " & Datum & " " & objItem.Name  
        End If
			
    End If
objFSO.CreateTextFile(counterFile).Write "Alte Verzeichnisse: " & intAlteVerz & vbTab & "Alte Dateien: " & intAlteDatei  
Next
Mitglied: bastla
bastla 07.07.2011 um 18:23:30 Uhr
Goto Top
Hallo sascha123!

Du solltest die Zeilen 37 und 38 tauschen (da ansonsten unnötiger Weise bei jedem Durchlauf die Datei erstellt wird) ...

Ansonsten: Schreibrechte in der Freigabe hast Du ja sicher, und die Zeile
counterFile = "\\server\ARCHIV\ZIPPEN am " & Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2) & ".txt"
gibt es auch schon vor der Schleife ...

Grüße
bastla
Mitglied: 84409
84409 07.07.2011 um 18:26:58 Uhr
Goto Top
Ja da habe ich Schreibrechte, nachdem ich das jetzt getauscht habe bekomme ich direkt den Fehler "Ungültige Stuervariable für 'for'-Schleife" in der ersten Zeile.
Mitglied: bastla
bastla 07.07.2011 um 18:36:03 Uhr
Goto Top
Hallo sascha123!

Da Du inzwischen Änderungen vorgenommen hast (etwa "Alt" durch "AltDatum" ersetzt), solltest Du einmal das gesamte Script posten ...

Grüße
bastla
Mitglied: 84409
84409 07.10.2011 um 10:41:46 Uhr
Goto Top
Hallo zusammen, hallo Bastla, sorry, ich konnte ne zeit lang nicht am Script weiter arbeiten, da sich einiges wichtigeres dazwischen gedrängt hat.

Bitte nehmt's mir nicht übel, dass ich erst jetzt antworte und das Thema wieder aufgreife.

Hier nochmal das ganze Script, wie ich es hier habe, ein bisschen muss ich mihc auch nochmal reindenken, aber der letzte Stand ist die Fehlermeldung "Ungültige Steuervariabel in Zeile 46..."
myFolder = "C:\test\"  
myZipFile = ("\\SERVER\Verzeichnis\ARCHIV\" & (Date()&".zip"))  

counterFile = ("\\SERVER\Verzeichnis\ARCHIV\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("m", -10, 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			  
                '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				  
            'WScript.Sleep 1000  
			intAlteDatei = intAlteDatei + 1
        Else
            WScript.Echo "Neu V: " & Datum & " " & objItem.Name  
        End If
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  
                'oZDatei.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count))  
                'oZDatei.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  
            'oZDatei.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count))  
            'oZDatei.Close				  
            'WScript.Sleep 1000  
			intAlteDatei = intAlteDatei + 1
        Else
            WScript.Echo "Neu V: " & Datum & " " & objItem.Name  
        End If
			
    End If
objFSO.CreateTextFile(counterFile).Write "Alte Verzeichnisse: " & intAlteVerz & vbTab & "Alte Dateien: " & intAlteDatei  
Next			
    End If
Next
Mitglied: bastla
bastla 07.10.2011 um 16:46:56 Uhr
Goto Top
Hallo sascha123!

Welchen Sinn sollen denn die Zeilen 46 bis 83 haben? Bis auf ein paar eingestreute Leerzeichen / TAB und die auskommentierten Zeilen 61, 62, 77 und 78 sind die doch eigentlich gleich wie 12 bis 45 ...

Grüße
bastla
Mitglied: 84409
84409 10.10.2011 um 11:28:51 Uhr
Goto Top
So
myFolder = "C:\test\"  
myZipFile = ("\\SERVER\ARCHIV\" & (Date()&".zip"))  

counterFile = ("C:\test\ZIPPEN am " & Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2) & ".txt") '\\SERVER\ARCHIV  

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

AltDatum = DateAdd("m", -10, 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
'objFSO.CreateTextFile(counterFile).Write "Alte Verzeichnisse: " & intAlteVerz & vbTab & "Alte Dateien: " & intAlteDatei  
Next

läuft soweit so gut alles, wobei das Schreiben in Zeile 52 scheinbar noch nicht so gut klappt.
"Erlaubnis verweigert" ist da die Fehlermeldung, sicherheitshalber habe ich den Pfad mal auf C\Test angepasst, aber der selbe Fehler...

Wenn ich das auskommentie und das Schreibe-in-Datei sein lasse, bekomme ich so einen Fehler bei Zeile 41 "Objekt erforderlich"....
Mitglied: bastla
bastla 10.10.2011, aktualisiert am 18.10.2012 um 18:48:43 Uhr
Goto Top
Hallo sascha123!

Die Zeile 52 sollte nach Zeile 53 folgen (hatte ich aber oben auch schon angemerkt) - den Rest kann ich mir erst später ansehen ...

Grüße
bastla
Mitglied: 84409
84409 10.10.2011 um 12:21:40 Uhr
Goto Top
Ok, danke - gesagt getan.

jetzt dachte ich mir, kann ich auch direkt die Anzahl statt den Test-Text schreiben lassen, aber Zeile 43 "Das Objekt unterstüzt diese Eigenschaft oder methode nicht: "objFolder.SubFolders.Files.Count"", wie bekomme ich die denn sonst gezählt?
Mitglied: bastla
bastla 10.10.2011 um 23:48:23 Uhr
Goto Top
Hallo sascha123!

Was genau willst Du denn mit
objFolder.SubFolders.Files.Count
erreichen? Da "SubFolder" eine Aufzählung der Unterordner des aktuellen "objFolder" ist, kannst Du die nur mit einer Schleife einzeln abklappern und dann die jeweilige Anzahl (und auch nur der sich unmittelbar darin, nicht aber auch in Unter-Unterordnern befindlichen) "Files" ermitteln ...

Grüße
bastla
Mitglied: 84409
84409 11.10.2011 um 09:20:37 Uhr
Goto Top
Das würde dann wie lauten?

So?

For Each objItem in objFolder( myFolder ).Subfolder...
Mitglied: 84409
84409 21.11.2011 um 16:01:11 Uhr
Goto Top
Hallo, ist hier noch wer dran? Ich komm da nicht weiter...
Mitglied: bastla
bastla 21.11.2011 um 16:19:04 Uhr
Goto Top
Hallo sascha123!

Magst Du vielleicht trotzdem nochmal erklären, was Du eigentlich willst - die Idee, nach jeder einzelnen alten Datei die Anzahl an Dateien im aktuellen Ordner sowie allen Unterordnern zu ermitteln (zumindest interpretiere ich zB die Zeile 43 so) würde ich mal "speziell" nennen, und das dann auch noch in eine Datei schreiben zu wollen, die nach dem letzten derartigen Vorgang geschlossen wurde (Zeile 44) ist "aussichtslos" ... face-wink

Grüße
bastla
Mitglied: 84409
84409 21.11.2011 um 16:33:31 Uhr
Goto Top
Grundsätzlich möchte ich datei die ein gewisses Alter haben in eine ZIP Datei packen.
Und Am Ende, natürlich nicht nach jeder Datei, ermittelt haben wie viele Dateien denn nun endlich INKLUSIVE Unterordnerinhalt "gezippt" wurden.

Danke für deine Hilfe, da ich kein (guter) Programmierer bin, kommt leider am Ende manchmal so etwas Unverständliches heraus... sorry!
Mitglied: bastla
bastla 21.11.2011, aktualisiert am 18.10.2012 um 18:49:09 Uhr
Goto Top
Hallo sascha123!
wie viele Dateien ... INKLUSIVE Unterordnerinhalt
verstehe ich nicht - die Anzahl der alten Dateien wird ja ohnehin gezählt, und was hätte der Unterordnerinhalt damit zu tun?

Wenn allerdings auch die Unterordner untersucht werden sollten, müsstest Du einerseits Rekursion verwenden (siehe zB die ähnlich gelagerte Problemstellung hier), und andererseits würden dann die darin gefundenen alten Dateien aber ohnehin ebenfalls in "intAlteDateien" mitgezählt werden ...

Grüße
bastla