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:
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
Danke!
MfG
Braindead
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
Danke!
MfG
Braindead
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 184811
Url: https://administrator.de/contentid/184811
Ausgedruckt am: 21.11.2024 um 22:11 Uhr
20 Kommentare
Neuester Kommentar
Hallo Braindead!
Unter der Annahme, dass nur eine Ordnerebene untersucht werden muss, könntest Du es etwa so versuchen:
Starten (wegen der Bildschirmausgaben) aus einer CMD-Shell per "
Bitte beachten: Die alten Dateien werden kommentarlos gelöscht (siehe Zeile 29)!
Grüße
bastla
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
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
Hallo Braindead!
... 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
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
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 "
... strange jedenfalls, das Ganze ...
Solange Du nur testest, könntest Du die Zeile 29 "entschärfen":
- 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
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
Grüße
bastla
also hier mein erster ansatz in powershell.
es wird noch keine log-datei erstellt und noch nicht der komplette pfad in der zipdatei erstellt.
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
Hallo Braindead!
Ungetestet:
Grüße
bastla
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
"bastla
Hallo Braindead!
Dann bastle ich zur Strafe auch an Deinem Code herum :
Anmerkungen:
Zu "
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 "
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 "
Grüße
bastla
Dann bastle ich zur Strafe auch an Deinem Code herum :
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
Zu "
Dim
": Entweder alle vorkommenden Variablen deklarieren und als erste ZeileOption Explicit
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
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 ...
Grüße
bastla
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. Hast Du Informatik studiert oder in Sachen VB alles selbst angelernt?
Ja (etwas von beidem)Grüße
bastla