cbli
Goto Top

Script zur Benutzung von Winrar mit Textausgabe und Fehlerbehandlung

Ich möchte gepackte Dateien mit bestimmten Endungen aus einem Verzeichnis auswählen lassen,diese vor dem Entpacken anzeigen lassen (nicht in Txt Datei - sondern msgbox).
Daraufhin sollen nur diese gefundenen Dateien in ein anderes Verzeichnis entpackt werden und
dort später weiterverabeitet werden.

Dieser Teil des Scripts funktioniert schon.

Was nicht funktioniert ist,daß der Dateiname jeder entpackten Datei zusätzlich noch in eine Textdatei geschrieben werden soll.
Er schreibt zwar die Textdatei,aber überschreibt immer nur alles was zuvor in der 1 Zeile stand. Ich möchte das alles untereinander aufgelistet wird.
For Appending habe ich benutzt.
Diese Textdatei soll nach Ende des Scripts angezeigt werden in einer msgbox oder als txt datei geöffnet werden.

Nächstes Problem ist die Fehlerbehandlung mit winrar.
Funktioniert überhaupt nicht so wie es soll.
Ich möchte,daß wenn ein Fehler z.B beim entpacken auftritt,dieser mit dem Dateinamen und der fehlernummer in einer Textdatei gespeichert werden soll.
Diese Textdatei soll nach Ende des Scripts angezeigt werden in einer msgbox oder als txt datei geöffnet werden.

Letztes Problem ist,daß nach dem entpacken noch bestimmte Dateien mit bestimmten Dateiendungen in ein anderes Verzeichnis verschieben will.
Wie der move befehl funktioniert weiß ich,nur will ich ja nicht die ganzen Dateiendungen einzeln im Script behandeln,sondern es als Schleife handeln.
Doch das funktioniert nicht.
Das Sahnehäubchen auf das Ganze wäre noch,wenn die Dateien aus dem Ursprungsverzeichnis
automatisch gelöscht werden,aber nur wenn das entpacken der einzelnen Dateien ohne Fehler abgeschlossen wurde.

Vielen Vielen Dank für eure Hilfe

Gruß
Claus

Option Explicit

' Variablen deklarieren  
Dim strExtension
Dim objDatei
Dim objFSO
Dim objOrdner
Dim strOrdner
Dim WshShell
Dim rarfile
Dim entpack
Dim value
Dim objFs
Dim strWriteString
Dim strDateiname
Dim objTextStream
Const ForAppending = 8
Dim fso

On Error Resume Next

Set fso = CreateObject("Scripting.FileSystemObject")  
fso.GetFile("d:\entpackt.txt").Delete  

if err.Number <> 0 then
msgbox   "Datei nicht vorhanden - Script wird fortgesetzt" ,64, "Hinweis"  
end if

Set objFSO = CreateObject("Scripting.FileSystemObject")  
strOrdner = "D:\temp\dateien"  
strExtension = "tar"  

Set WshShell = WScript.CreateObject("WScript.Shell")  
msgbox "Automatisches Entpacken von Tar Dateien" , 64, "Information"  

' Tar Verarbeitung  
Set objOrdner = objFSO.GetFolder(strOrdner)
For Each objDatei In objOrdner.Files
   If (Right(objDatei.name, Len(strExtension))) = (strExtension) Then
        msgbox "Folgende Tar Datei wird entpackt "  & vbNewLine & vbNewLine & objDatei.name ,64,"Hinweis"  

WshShell.Run ("c:\programme\winrar\winrar.exe e -y -v -o+ " & objdatei.name & " D:\entpackt\"),,true  

' FileSystemObject objFs oeffnen  
Set objFs= CreateObject("Scripting.FileSystemObject")  

' Dateiname festlegen  
strDateiname = ("d:\entpackt.txt")  

' Einen Textstream (objTextStream) zur Textdatei oeffnen  
Set objTextStream = objFs.CreateTextFile(strDateiname,ForAppending,True)


if err.Number <> 0 then
msgbox "   " & objDatei.name & "      konnte nicht entpackt werden",16,"Fehler"  
objTextStream.WriteLine "Fehler2: " & err.Number & " " & err.Description  
err.Clear


' Inhalt fuer Datei in String strWriteString speichern:  
strWriteString = objDatei.name

' String in Datei schreiben:  
objTextStream.WriteLine strWriteString

' Objekte schliessen  
objTextStream.Close
Set objTextStream = Nothing
Set objFs = Nothing

end if
'end if  
next

'---------------------------------------------------------------------------------------------------  

msgbox "Automatisches Entpacken von Rar Dateien" , 64, "Information"  

' Rar Verarbeitung  
strExtension = "rar"  
Set objOrdner = objFSO.GetFolder(strOrdner)
For Each objDatei In objOrdner.Files
   If (Right(objDatei.name, Len(strExtension))) = (strExtension) Then
        msgbox "Folgende Rar Datei wird entpackt "  & vbNewLine & vbNewLine & objDatei.name ,64,"Hinweis"  

WshShell.Run ("c:\programme\winrar\winrar.exe e -y -v -o+ " & objdatei.name & " D:\entpackt\"),,true  

' FileSystemObject objFs oeffnen  
Set objFs= CreateObject("Scripting.FileSystemObject")  

' Dateiname festlegen  
strDateiname = ("d:\entpackt.txt")  

' Einen Textstream (objTextStream) zur Textdatei oeffnen  
'Set objTextStream = objFs.CreateTextFile(strDateiname,8,True)  
Set objTextStream = objFs.OpenTextFile(strDateiname,8,True)


if err.Number <> 0 then
msgbox "   " & objDatei.name & "      konnte nicht entpackt werden",16,"Fehler"  
msgbox "Fehler: " & err.Number & " " & err.Description  
err.Clear


' Inhalt fuer Datei in String strWriteString speichern:  
strWriteString = objDatei.name

' String in Datei schreiben:  
objTextStream.WriteLine strWriteString

' Objekte schliessen  
objTextStream.Close
Set objTextStream = Nothing
Set objFs = Nothing

end if
'end if  
next
value = msgbox("Mit der Verarbeitung weitermachen ?" ,64 + vbYesNO, "Frage")  
if value = vbYes then

'-----------------------------------------------------------------------------------------------------  

' Endgültige Verarbeitung  
Set entpack = WScript.CreateObject("WScript.Shell")  
entpack.Run "c:\programme\winrar\winrar.exe e -y -v -o+ D:\entpackt\*.rar *.* D:\lager\",,true  

Dim movedateien
Dim moveordner
Dim endung(9),i

' Array mit Werten füllen  

endung(0) = "xls"  
endung(1) = "doc"  
endung(2) = "txt"  
endung(3) = "com"  
endung(4) = "exe"  
endung(5) = "vbs"  
endung(6) = "pst"  
endung(7) = "db"  
endung(8) = "mdb"  
endung(9) = "gdb"  

moveordner = "d:\entpackt\"  

Set movedateien = Server.CreateObject("Scripting.FileSystemObject")  
Set objOrdner = objFSO.GetFolder(moveordner)

For i=0 to 9
  endung(i) = i

For Each objDatei In objOrdner.Files
   If (Right(objDatei.name, Len(endung(i)))) = endung(i) Then

movedateien.MoveFile "d:\entpackt\" , " & objDatei.endung & ", "D:\lager\"  

set movedateien = nothing

end if
next
Next 
msgbox "Alle Dateien wurden verarbeitet", 64, "Hinweis"  


end if
if value = vbNO then
msgbox "Verarbeitung wird beendet",64, "Hinweis"  
end if

Content-Key: 70121

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

Ausgedruckt am: 29.03.2024 um 08:03 Uhr

Mitglied: bastla
bastla 04.10.2007 um 15:12:48 Uhr
Goto Top
Hallo cbli!

Er schreibt zwar die Textdatei,aber überschreibt immer nur alles was zuvor in der 1 Zeile stand. Ich möchte das alles untereinander aufgelistet wird.
Du verwendest ja auch die "CreateTextFile"-Methode und nicht "OpenTextFile".

Übrigens genügt ein einmaliges Erstellen des "FileSystemObject"s, du könntest also jeweils "fso" verwenden und damit "objFSO", "objFs" und auch "movedateien" ersetzen.

Und wenn ich schon dabei bin: Zwar deklarierst Du brav die verwendeten Variablen, aber die (eigentlich) Konstanten für "strOrdner", "strExtension" oder "strDateiname" etc versteckst Du mitten im Code, wobei der Dateiname auch noch tatsächlich konstant in "fso.GetFile("d:\entpackt.txt").Delete" vorkommt ...


Und auch danach hast Du nicht gefragt, aber:
If (Right(objDatei.name, Len(strExtension))) = (strExtension) Then
wird etwas sicherer, wenn Du auch andere Schreibweisen als nur durchgängige Kleinschreibung für den Dateityp berücksichtigst, also
If LCase(Right(objDatei.name, Len(strExtension))) = LCase(strExtension) Then
Wie der move befehl funktioniert weiß ich,nur will ich ja nicht die ganzen Dateiendungen einzeln im Script behandeln,sondern es als Schleife handeln.
Doch das funktioniert nicht.
endung(i) = i
ist widersinnig, da damit die vorher zugewiesenen Endungen durch die Zahlenwerte der Laufvariablen überschreiben werden - aus "xls" in "endung(0)" wird dann "0" - daher: ersatzlos streichen.

Als Alternative könntest Du übrigens auch noch etwa so vorgehen:
Endungen = Array("xls", "doc", ...)  
For Each Endung In Endungen
...
Next
wobei ich die Zuweisung "Endungen = Array(...)" ebenfalls zu den Variablen-/Konstanten-Deklarationen an den Anfang des Scripts setzen würde.

movedateien.MoveFile "d:\entpackt\" , " & objDatei.endung & ", "D:\lager\"  

set movedateien = nothing
kannst Du, da Du ja schon ein "File"-Objekt hast, ersetzen durch
objDatei.Move "D:\lager\"  
Am Ende könntest Du schließlich noch die Zeilen
end if
if value = vbNO then
durch ein einfaches "else" ersetzen ...
Hinsichtlich "winrar" würde ich, da Du ja ohnehin schon einen "Shell"-Aufruf verwendest, an eine Batch-Lösung denken, die auch gleich das Errorhandling / Verschieben / Löschen erledigen könnte.

Grüße
bastla