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

Zippen mittels VBS

Frage Entwicklung Batch & Shell

Mitglied: sascha123

sascha123 (Level 1) - Jetzt verbinden

06.07.2011, aktualisiert 18.10.2012, 5586 Aufrufe, 28 Kommentare

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:

01.
Option Explicit 
02.
 
03.
Dim myFolder, myZipFile, arrResult  
04.
 
05.
myFolder = "C:\Test\" 
06.
myZipFile = ("\\server\ARCHIV\" & (Date()&".zip")) 
07.
 
08.
arrResult = ZipFolder( myFolder, myZipFile ) 
09.
'If arrResult(0) = 0 Then 
10.
'    If arrResult(1) = 1 Then 
11.
'        WScript.Echo "Done; 1 empty subfolder was skipped." 
12.
'    Else 
13.
'        WScript.Echo "Done; " & arrResult(1) & " empty subfolders were skipped." 
14.
'    End If 
15.
'Else 
16.
'    WScript.Echo "ERROR " & Join( arrResult, vbCrLf ) 
17.
'End If 
18.
 
19.
 
20.
Function ZipFolder( myFolder, myZipFile ) 
21.
 
22.
    Dim intSkipped, intSrcItems 
23.
    Dim objApp, objFolder, objFSO, objItem, objTxt, FileObj, CheckVerzeichnis, altesDatum 
24.
    Dim strSkipped 
25.
 
26.
    Const ForWriting = 2 
27.
 
28.
    intSkipped = 0 
29.
 
30.
    ' Use custom error handling 
31.
    On Error Resume Next 
32.
 
33.
    ' Create an empty ZIP file 
34.
    Set objFSO = CreateObject( "Scripting.FileSystemObject" ) 
35.
    Set objTxt = objFSO.OpenTextFile( myZipFile, ForWriting, True ) 
36.
    objTxt.Write Chr(80) & Chr(75) & Chr(5) & Chr(6) & String(18, Chr(0) )   '"PK" & Chr(5) & Chr(6) & String( 18, Chr(0) ) 
37.
    objTxt.Close 
38.
    Set objTxt = Nothing 
39.
 
40.
    ' Abort on errors 
41.
    If Err Then 
42.
        ZipFolder = Array( Err.Number, Err.Source, Err.Description ) 
43.
        Err.Clear 
44.
        On Error Goto 0 
45.
        Exit Function 
46.
    End If 
47.
     
48.
    ' Create a Shell object 
49.
    Set objApp = CreateObject( "Shell.Application" ) 
50.
	Set FileObj = CreateObject("Scripting.FileSystemObject") 
51.
	Set CheckVerzeichnis = FileObj.GetFolder( myFolder ) 
52.
	 
53.
	'Set FSO = CreateObject( "Scripting.FileSystemObject" ) 
54.
	'Set oZDatei = FSO.OpenTextFile(counterFile, 2, True)  
55.
 
56.
    ' Copy the files to the compressed folder <- AB HIER WIRD DIE ZIP DATEI BEFÜLLT, DA MUSS MIT DEM DATUM GEARBEITET WERDEN, NUR WIE? 
57.
    For Each objItem in objApp.NameSpace( myFolder ).Items 
58.
        If objItem.IsFolder Then 
59.
            ' Check if the subfolder is empty, and if 
60.
            ' so, skip it to prevent an error message 
61.
            Set objFolder = objFSO.GetFolder( objItem.Path ) 
62.
            If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then 
63.
                intSkipped = intSkipped + 1 
64.
				 
65.
            Else 
66.
		objApp.NameSpace( myZipFile ).CopyHere objItem		 
67.
				WScript.Sleep 1000 
68.
				 
69.
            End If  
70.
        Else 
71.
			 
72.
For Each datei In CheckVerzeichnis.Files 
73.
	'altesDatum = datei.DateCreated 
74.
		MsgBox ("Datum: " & (datei.DateCreated)) 
75.
Next	 
76.
 
77.
            objApp.NameSpace( myZipFile ).CopyHere objItem 
78.
			WScript.Sleep 1000 
79.
			 
80.
        End If 
81.
    Next 
82.
 
83.
 
84.
    Set objFolder = Nothing 
85.
    Set objFSO    = Nothing 
86.
 
87.
    ' Abort on errors 
88.
    If Err Then 
89.
        ZipFolder = Array( Err.Number, Err.Source, Err.Description ) 
90.
        Set objApp = Nothing 
91.
        Err.Clear 
92.
        On Error Goto 0 
93.
        Exit Function 
94.
    End If 
95.
 
96.
    ' Keep script waiting until compression is done 
97.
    intSrcItems = objApp.NameSpace( myFolder  ).Items.Count 
98.
    Do Until objApp.NameSpace( myZipFile ).Items.Count + intSkipped = intSrcItems 
99.
        WScript.Sleep 1000 
100.
    Loop 
101.
    Set objApp = Nothing 
102.
 
103.
    ' Abort on errors 
104.
    If Err Then 
105.
        ZipFolder = Array( Err.Number, Err.Source, Err.Description ) 
106.
        Err.Clear 
107.
        On Error Goto 0 
108.
        Exit Function 
109.
    End If 
110.
 
111.
    ' Restore default error handling 
112.
    On Error Goto 0 
113.
 
114.
    ' Return message if empty subfolders were skipped 
115.
    If intSkipped = 0 Then 
116.
        strSkipped = "" 
117.
    Else 
118.
        strSkipped = "skipped empty subfolders" 
119.
    End If 
120.
 
121.
    ' Return code 0 (no error occurred) 
122.
    ZipFolder = Array( 0, intSkipped, strSkipped ) 
123.
	 
124.
End Function
28 Antworten
Mitglied: sascha123
06.07.2011 um 16:45 Uhr
Um genauer zu sein, geht es mir gerade erstmal um den Teil für's Debugging, wo mir das entsprechende Datum ausgegeben wird:

01.
    ' Copy the files to the compressed folder 
02.
    For Each objItem in objApp.NameSpace( myFolder ).Items 
03.
        If objItem.IsFolder Then 
04.
            ' Check if the subfolder is empty, and if 
05.
            ' so, skip it to prevent an error message 
06.
            Set objFolder = objFSO.GetFolder( objItem.Path ) 
07.
            If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then 
08.
                intSkipped = intSkipped + 1 
09.
								 
10.
            Else 
11.
				Datum = CStr(objItem.DateLastModified) 
12.
				MsgBox ("Check U " & Datum) 'DateLastModified 
13.
					'objApp.NameSpace( myZipFile ).CopyHere objItem ABSICHTLICH AUKOMMENTIERT, KOMMT SPÄTER WIEDER REIN
Bitte warten ..
Mitglied: bastla
06.07.2011 um 18:10 Uhr
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:
01.
Alt = DateAdd("m", -3, Date) 
02.
... 
03.
If Datum < Alt Then 'alte Datei 
04.
...
Grüße
bastla
Bitte warten ..
Mitglied: sascha123
07.07.2011 um 10:09 Uhr
DANKE!!!!!!!!!!!!! Ja genau das war die Zeile, die ich gestern gebraucht habe:

01.
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
Bitte warten ..
Mitglied: sascha123
07.07.2011 um 10:36 Uhr
Ich habe das ganze mal hier so umgesetzt (bis auf den Tipp mit der MsgBox, da war ich gerade etwas zu faul für):

01.
        If objItem.IsFolder Then 
02.
            ' Check if the subfolder is empty, and if 
03.
            ' so, skip it to prevent an error message 
04.
            Set objFolder = objFSO.GetFolder( objItem.Path ) 
05.
            If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then 
06.
                intSkipped = intSkipped + 1 
07.
								 
08.
            Else 
09.
				Datum = objFSO.GetFile(objItem.Path).DateLastModified 
10.
				'MsgBox ("Check U " & Datum) 'DateLastModified 
11.
				 
12.
				Alt = DateAdd("m", -3, Date) 
13.
					If Datum < Alt Then 'alte Datei 
14.
						'objApp.NameSpace( myZipFile ).CopyHere objItem 
15.
						MsgBox "Alt U" 
16.
						'oZDatei.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count)) 
17.
						'oZDatei.Close				 
18.
						WScript.Sleep 1000 
19.
					Else 
20.
						MsgBox "Neu U" 
21.
					End If 
22.
				 
23.
            End If  
24.
			Else 
25.
				Datum = objFSO.GetFile(objItem.Path).DateLastModified 
26.
				'MsgBox ("Check V " & Datum) 'DateLastModified 
27.
				 
28.
				Alt = DateAdd("m", -3, Date) 
29.
					If Datum < Alt Then 'alte Datei 
30.
						'objApp.NameSpace( myZipFile ).CopyHere objItem 
31.
						MsgBox "Alt V" 
32.
						'oZDatei.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count)) 
33.
						'oZDatei.Close				 
34.
						WScript.Sleep 1000 
35.
					Else 
36.
						MsgBox "Neu V" 
37.
					End If 
38.
			 
39.
        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:

01.
Alt = DateAdd("m", -3, Date) 
Alt ist das jetzige Datum MINUS 3 Monate ("m")???

Danke und Grüße!
Bitte warten ..
Mitglied: bastla
07.07.2011 um 10:53 Uhr
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
Bitte warten ..
Mitglied: sascha123
07.07.2011 um 12:16 Uhr
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.

01.
        If objItem.IsFolder Then 
02.
 
03.
            Set objFolder = objFSO.GetFolder( objItem.Path ) 
04.
            If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then 
05.
                intSkipped = intSkipped + 1 
06.
								 
07.
            Else 
08.
				Datum = objFSO.GetFolder(objItem.Path).DateLastModified 
09.
				 
10.
					If Datum > AltDatum Then 'alte Datei 
11.
						'objApp.NameSpace( myZipFile ).CopyHere objItem 
12.
						'WScript.Sleep 1000 
13.
						MsgBox "Alt U " & AltDatum 
14.
		 
15.
					Else 
16.
						MsgBox "Neu U " & AltDatum 
17.
					End If 
18.
				 
19.
            End If  
20.
			Else 
21.
				Datum = objFSO.GetFile(objItem.Path).DateLastModified 
22.
				 
23.
					If Datum > AltDatum Then 'alte Datei 
24.
						'objApp.NameSpace( myZipFile ).CopyHere objItem 
25.
						'WScript.Sleep 1000 
26.
						MsgBox "Alt V " & AltDatum 
27.
			 
28.
					Else 
29.
						MsgBox "Neu V " & AltDatum 
30.
					End If 
31.
			 
32.
        End If
Bitte warten ..
Mitglied: bastla
07.07.2011 um 12:44 Uhr
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 ) ist ...

Bei mir funktionier jedenfalls der folgende Schnipsel wunschgemäß:
01.
myFolder ="D:\TEMP" 
02.
Set objApp = CreateObject( "Shell.Application" ) 
03.
Set ObjFSO = CreateObject("Scripting.FileSystemObject") 
04.
Set CheckVerzeichnis = ObjFSO.GetFolder( myFolder ) 
05.
 
06.
Alt = DateAdd("m", -3, Date) 
07.
For Each objItem in objApp.NameSpace(myFolder).Items 
08.
    If objItem.IsFolder Then 
09.
        ' Check if the subfolder is empty, and if 
10.
        ' so, skip it to prevent an error message 
11.
        Set objFolder = objFSO.GetFolder( objItem.Path ) 
12.
        If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then 
13.
            intSkipped = intSkipped + 1 
14.
 
15.
        Else 
16.
            Datum = objFSO.GetFolder(objItem.Path).DateLastModified 
17.
            'MsgBox ("Check U " & Datum) 'DateLastModified 
18.
				 
19.
            If Datum < Alt Then 'alte Datei 
20.
                'objApp.NameSpace( myZipFile ).CopyHere objItem 
21.
                WScript.Echo "Alt U: " & Datum & " " & objItem.Name 
22.
                'oZDatei.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count)) 
23.
                'oZDatei.Close				 
24.
                'WScript.Sleep 1000 
25.
            Else 
26.
                WScript.Echo "Neu U: " & Datum & " " & objItem.Name 
27.
            End If 
28.
				 
29.
        End If  
30.
    Else 
31.
        Datum = objFSO.GetFile(objItem.Path).DateLastModified 
32.
        'MsgBox ("Check V " & Datum) 'DateLastModified 
33.
				 
34.
        If Datum < Alt Then 'alte Datei 
35.
            'objApp.NameSpace( myZipFile ).CopyHere objItem 
36.
            WScript.Echo "Alt V: " & Datum & " " & objItem.Name 
37.
            'oZDatei.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count)) 
38.
            'oZDatei.Close				 
39.
            'WScript.Sleep 1000 
40.
        Else 
41.
            WScript.Echo "Neu V: " & Datum & " " & objItem.Name 
42.
        End If 
43.
			 
44.
    End If 
45.
Next
Beim Testen starte ich aus einem CMD-Fenster mit
cscript //nologo C:\Scripts\Zippen.vbs
Grüße
bastla
Bitte warten ..
Mitglied: sascha123
07.07.2011 um 16:44 Uhr
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?

01.
counterFile = (\"\\\\server\\ARCHIV\\ZIPPEN am \" & (Date()&\".txt\"))
Bitte warten ..
Mitglied: bastla
07.07.2011 um 17:03 Uhr
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
Bitte warten ..
Mitglied: sascha123
07.07.2011 um 17:11 Uhr
Ah ok, guter Tipp.

Damit wäre die Datei erstellt

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!!!!!
Bitte warten ..
Mitglied: bastla
07.07.2011 um 17:30 Uhr
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
Bitte warten ..
Mitglied: sascha123
07.07.2011 um 17:53 Uhr
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
Da bräuchte ich die Codeschnipsel für, erstellt wird die Datei ja auch schon....

Danke und Grüße!!!
Bitte warten ..
Mitglied: bastla
07.07.2011 um 18:00 Uhr
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:
01.
Set objcounterFile = objFSO.CreateTextFile(counterFile) 
02.
objcounterFile WriteLine "Alte Verzeichnisse: " & intAlteVerz 
03.
objcounterFile WriteLine "Alte Dateien: " & intAlteDatei 
04.
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
Bitte warten ..
Mitglied: sascha123
07.07.2011 um 18:18 Uhr
DANKE DANKE DANKE!

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

01.
For Each objItem in objApp.NameSpace( myFolder ).Items 
02.
    If objItem.IsFolder Then 
03.
        ' Check if the subfolder is empty, and if 
04.
        ' so, skip it to prevent an error message 
05.
        Set objFolder = objFSO.GetFolder( objItem.Path ) 
06.
        If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then 
07.
            intSkipped = intSkipped + 1 
08.
 
09.
        Else 
10.
            Datum = objFSO.GetFolder(objItem.Path).DateLastModified 
11.
            'MsgBox ("Check U " & Datum) 'DateLastModified 
12.
				 
13.
            If Datum < AltDatum Then 'alte Datei 
14.
                'objApp.NameSpace( myZipFile ).CopyHere objItem 
15.
                WScript.Echo "Alt U: " & Datum & " " & objItem.Name			 
16.
                'WScript.Sleep 1000 
17.
				intAlteVerz = intAlteVerz + 1 
18.
            Else 
19.
                WScript.Echo "Neu U: " & Datum & " " & objItem.Name 
20.
            End If 
21.
				 
22.
        End If  
23.
    Else 
24.
        Datum = objFSO.GetFile(objItem.Path).DateLastModified 
25.
        'MsgBox ("Check V " & Datum) 'DateLastModified 
26.
				 
27.
        If Datum < AltDatum Then 'alte Datei 
28.
            'objApp.NameSpace( myZipFile ).CopyHere objItem 
29.
            WScript.Echo "Alt V: " & Datum & " " & objItem.Name			 
30.
            'WScript.Sleep 1000 
31.
			intAlteDatei = intAlteDatei + 1 
32.
        Else 
33.
            WScript.Echo "Neu V: " & Datum & " " & objItem.Name 
34.
        End If 
35.
			 
36.
    End If 
37.
objFSO.CreateTextFile(counterFile).Write "Alte Verzeichnisse: " & intAlteVerz & vbTab & "Alte Dateien: " & intAlteDatei 
38.
Next
Bitte warten ..
Mitglied: bastla
07.07.2011 um 18:23 Uhr
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
Bitte warten ..
Mitglied: sascha123
07.07.2011 um 18:26 Uhr
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.
Bitte warten ..
Mitglied: bastla
07.07.2011 um 18:36 Uhr
Hallo sascha123!

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

Grüße
bastla
Bitte warten ..
Mitglied: sascha123
07.10.2011 um 10:41 Uhr
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..."
01.
myFolder = "C:\test\" 
02.
myZipFile = ("\\SERVER\Verzeichnis\ARCHIV\" & (Date()&".zip")) 
03.
 
04.
counterFile = ("\\SERVER\Verzeichnis\ARCHIV\ZIPPEN am " & Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2) & ".txt") 
05.
 
06.
Set objApp = CreateObject( "Shell.Application" ) 
07.
Set ObjFSO = CreateObject( "Scripting.FileSystemObject" ) 
08.
Set objcounterFile = objFSO.CreateTextFile(counterFile) 
09.
 
10.
AltDatum = DateAdd("m", -10, Date) 
11.
 
12.
For Each objItem in objApp.NameSpace( myFolder ).Items 
13.
    If objItem.IsFolder Then 
14.
        ' Check if the subfolder is empty, and if 
15.
        ' so, skip it to prevent an error message 
16.
        Set objFolder = objFSO.GetFolder( objItem.Path ) 
17.
        If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then 
18.
            intSkipped = intSkipped + 1 
19.
 
20.
        Else 
21.
            Datum = objFSO.GetFolder(objItem.Path).DateLastModified 
22.
            'MsgBox ("Check U " & Datum) 'DateLastModified 
23.
				 
24.
            If Datum < AltDatum Then 'alte Datei 
25.
                'objApp.NameSpace( myZipFile ).CopyHere objItem 
26.
                WScript.Echo "Alt U: " & Datum & " " & objItem.Name			 
27.
                'WScript.Sleep 1000 
28.
				intAlteVerz = intAlteVerz + 1 
29.
            Else 
30.
                WScript.Echo "Neu U: " & Datum & " " & objItem.Name 
31.
            End If 
32.
				 
33.
        End If  
34.
    Else 
35.
        Datum = objFSO.GetFile(objItem.Path).DateLastModified 
36.
        'MsgBox ("Check V " & Datum) 'DateLastModified 
37.
				 
38.
        If Datum < AltDatum Then 'alte Datei 
39.
            'objApp.NameSpace( myZipFile ).CopyHere objItem 
40.
            WScript.Echo "Alt V: " & Datum & " " & objItem.Name				 
41.
            'WScript.Sleep 1000 
42.
			intAlteDatei = intAlteDatei + 1 
43.
        Else 
44.
            WScript.Echo "Neu V: " & Datum & " " & objItem.Name 
45.
        End If 
46.
For Each objItem in objApp.NameSpace( myFolder ).Items 
47.
    If objItem.IsFolder Then 
48.
        ' Check if the subfolder is empty, and if 
49.
        ' so, skip it to prevent an error message 
50.
        Set objFolder = objFSO.GetFolder( objItem.Path ) 
51.
        If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then 
52.
            intSkipped = intSkipped + 1 
53.
 
54.
        Else 
55.
            Datum = objFSO.GetFolder(objItem.Path).DateLastModified 
56.
            'MsgBox ("Check U " & Datum) 'DateLastModified 
57.
				 
58.
            If Datum < AltDatum Then 'alte Datei 
59.
                'objApp.NameSpace( myZipFile ).CopyHere objItem 
60.
                WScript.Echo "Alt U: " & Datum & " " & objItem.Name 
61.
                'oZDatei.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count)) 
62.
                'oZDatei.Close				 
63.
                'WScript.Sleep 1000 
64.
				intAlteVerz = intAlteVerz + 1 
65.
            Else 
66.
                WScript.Echo "Neu U: " & Datum & " " & objItem.Name 
67.
            End If 
68.
				 
69.
        End If  
70.
    Else 
71.
        Datum = objFSO.GetFile(objItem.Path).DateLastModified 
72.
        'MsgBox ("Check V " & Datum) 'DateLastModified 
73.
				 
74.
        If Datum < AltDatum Then 'alte Datei 
75.
            'objApp.NameSpace( myZipFile ).CopyHere objItem 
76.
            WScript.Echo "Alt V: " & Datum & " " & objItem.Name 
77.
            'oZDatei.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count)) 
78.
            'oZDatei.Close				 
79.
            'WScript.Sleep 1000 
80.
			intAlteDatei = intAlteDatei + 1 
81.
        Else 
82.
            WScript.Echo "Neu V: " & Datum & " " & objItem.Name 
83.
        End If 
84.
			 
85.
    End If 
86.
objFSO.CreateTextFile(counterFile).Write "Alte Verzeichnisse: " & intAlteVerz & vbTab & "Alte Dateien: " & intAlteDatei 
87.
Next			 
88.
    End If 
89.
Next
Bitte warten ..
Mitglied: bastla
07.10.2011 um 16:46 Uhr
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
Bitte warten ..
Mitglied: sascha123
10.10.2011 um 11:28 Uhr
So
01.
myFolder = "C:\test\" 
02.
myZipFile = ("\\SERVER\ARCHIV\" & (Date()&".zip")) 
03.
 
04.
counterFile = ("C:\test\ZIPPEN am " & Year(Date) & "-" & Right("0" & Month(Date), 2) & "-" & Right("0" & Day(Date), 2) & ".txt") '\\SERVER\ARCHIV 
05.
 
06.
Set objApp = CreateObject( "Shell.Application" ) 
07.
Set ObjFSO = CreateObject( "Scripting.FileSystemObject" ) 
08.
Set objcounterFile = objFSO.CreateTextFile(counterFile) 
09.
 
10.
AltDatum = DateAdd("m", -10, Date) 
11.
 
12.
For Each objItem in objApp.NameSpace( myFolder ).Items 
13.
    If objItem.IsFolder Then 
14.
        ' Check if the subfolder is empty, and if 
15.
        ' so, skip it to prevent an error message 
16.
        Set objFolder = objFSO.GetFolder( objItem.Path ) 
17.
        If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then 
18.
            intSkipped = intSkipped + 1 
19.
 
20.
        Else 
21.
            Datum = objFSO.GetFolder(objItem.Path).DateLastModified 
22.
            'MsgBox ("Check U " & Datum) 'DateLastModified 
23.
				 
24.
            If Datum < AltDatum Then 'alte Datei 
25.
                objApp.NameSpace( myZipFile ).CopyHere objItem 
26.
                WScript.Echo "Alt U: " & Datum & " " & objItem.Name 
27.
                objcounterFile.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count)) 
28.
                objcounterFile.Close				 
29.
                WScript.Sleep 1000 
30.
				intAlteVerz = intAlteVerz + 1 
31.
            Else 
32.
                WScript.Echo "Neu U: " & Datum & " " & objItem.Name 
33.
            End If 
34.
				 
35.
        End If  
36.
    Else 
37.
        Datum = objFSO.GetFile(objItem.Path).DateLastModified 
38.
        'MsgBox ("Check V " & Datum) 'DateLastModified 
39.
				 
40.
        If Datum < AltDatum Then 'alte Datei 
41.
            objApp.NameSpace( myZipFile ).CopyHere objItem 
42.
            WScript.Echo "Alt V: " & Datum & " " & objItem.Name 
43.
            objcounterFile.WriteLine "Test Unterverzeichnis"'(CInt(objFolder.Files.Count) + CInt(objFolder.SubFolders.Files.Count)) 
44.
            objcounterFile.Close				 
45.
            WScript.Sleep 1000 
46.
			intAlteDatei = intAlteDatei + 1 
47.
        Else 
48.
            WScript.Echo "Neu V: " & Datum & " " & objItem.Name 
49.
        End If 
50.
			 
51.
    End If 
52.
'objFSO.CreateTextFile(counterFile).Write "Alte Verzeichnisse: " & intAlteVerz & vbTab & "Alte Dateien: " & intAlteDatei 
53.
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"....
Bitte warten ..
Mitglied: bastla
10.10.2011, aktualisiert 18.10.2012
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
Bitte warten ..
Mitglied: sascha123
10.10.2011 um 12:21 Uhr
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?
Bitte warten ..
Mitglied: bastla
10.10.2011 um 23:48 Uhr
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
Bitte warten ..
Mitglied: sascha123
11.10.2011 um 09:20 Uhr
Das würde dann wie lauten?

So?

01.
For Each objItem in objFolder( myFolder ).Subfolder...
Bitte warten ..
Mitglied: sascha123
21.11.2011 um 16:01 Uhr
Hallo, ist hier noch wer dran? Ich komm da nicht weiter...
Bitte warten ..
Mitglied: bastla
21.11.2011 um 16:19 Uhr
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" ...

Grüße
bastla
Bitte warten ..
Mitglied: sascha123
21.11.2011 um 16:33 Uhr
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!
Bitte warten ..
Mitglied: bastla
21.11.2011, aktualisiert 18.10.2012
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
VB for Applications
gelöst Bestimmte Spalten aus CSV-Datei auslesen (VBS) (9)

Frage von Gurkenhobel zum Thema VB for Applications ...

Batch & Shell
Eventlog Druckjobs mit VBS auslesen (2)

Frage von joni2000de zum Thema Batch & Shell ...

VB for Applications
VBS Script zum versenden mehrerer Verknüpfungen zu Dateien per Lotus Notes

Frage von Sentinel87 zum Thema VB for Applications ...

Windows 7
gelöst Batch-Skript oder VBS Skript zum Sichern von Office Vorlagen (2)

Frage von Ceejaay zum Thema Windows 7 ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...