Jump to content

Per VBS Datei ausführen oder Batch-Code aufrufen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Wieder einmal ein VBS-Problemchen ;)

 

Ich muss aus der Registry den Pfad auslesen, welchen Outlook für temporäre Dateien verwendet, da dieser nicht auf jedem Rechner der selbe ist (Sucht man den Pfad per Explorer, sucht man vergeblich, auch wenn man Systemdateien und versteckte Dateien anzeigen lässt).

Diesen Ordner muss man einfach leeren können, da wir hiermit oftmals Probleme wegen FAXEN haben, bis man diesen Ordner eben geleert hat!

 

Hier mein Code, der eben so weit eigentlich funktioniert. Aber es kommt immer die Meldung:

"Das System kann die angegebene Datei nicht finden!"

nachdem er den Ordner leeren soll.

Ich habe den Inhalt der Variablen "loeschen" schon in eine .bat-Datei schreiben lassen und wenn ich diese manuell ausführe, werden die Dateien gelöscht, was bedeutet, dass die löschen-zeile doch soweit richtig ist, oder?

Was ist noch falsch?

Hier der bisherige Code:

 

Dim Path

Dim Value

Dim WshShell

Dim loeschen

 

set objshl = createobject("wscript.shell")

Set WshShell = CreateObject("Wscript.Shell")

 

Path = "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Outlook\Security\OutlookSecureTempFolder"

Value = WshShell.RegRead(Path)

 

loeschen = "del """ + Value + "*.*"" /q"

 

WScript.Echo loeschen

 

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.CreateTextFile("c:\temp.bat")

 

'objFile.WriteLine(loeschen)

'objFile.WriteLine "pause"

'objFile.WriteLine "del c:\temp.bat"

 

Die letzten 3 Zeilen erstellen die Batch-Datei, welche sich nach Ausführen selbst wieder löschen soll, aber ich weiß nicht wie ich diese Batch-Datei "starten" kann!? und das ist auch die unschönere Art.

 

Thankx for Infos and Help!

Link zu diesem Kommentar

Um z.B. die Bat auszuführen hilft Dir folgendes:

 

DIM intReturnCode

DIM ProgrammPath

ProgrammPath = "C:\Ordern"

programmFile = "löschen.bat"

 

Set WshShell = WScript.CreateObject("Wscript.Shell")

intReturnCode = WshShell.Run(programmPath & programmFile)

 

Die Syntax für WshShell.Run lautet normal:

 

rückgabeWert = WshShell.Run(Befehl, fensterTyp, warten)

 

Genaueres findest unter:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/6f28899c-d653-4555-8a59-49640b0e32ea.asp

 

Gruß

Notesuser3

Link zu diesem Kommentar

Hast Du gar keinen Ansatz für das Löschen unter VB-Skript geschrieben, oder fehlt ein Teil des Codes?

 

Um eine Datei zu löschen brauchst Du folgendes:

 

Set fso = CreateObject("Scripting.FileSystemObject")

 

fso.DeleteFile dateiName, erzwingen

 

DateiName ist klar, wobei natürlich der Pfad mit angegeben werden muss, den liest Du ja aus der Registry aus. Erzwingen ist ein Optionaler Parameter, entweder True oder False.

 

Damit sollte es funktionieren.

 

Falls Du noch fragen hast, melde Dich.

 

Gruß

 

NotesUser3

Link zu diesem Kommentar

Die Batch-Datei löscht sich selbst ;) (Die letzten 3 Zeilen, welche ich zunächst auskommentierte zeigt, was in diese Batch-Datei geschrieben wird)

 

Danke für deine Infos!

 

Hier noch das komplette Script so wie ich es bisher habe - funktionsfertig:

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

Dim Path

Dim Value

Dim WshShell

Dim loeschen

 

Set WshShell = CreateObject("Wscript.Shell")

 

'Aus Registry auslesen, wo die Temporären Dateien liegen

Path = "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Outlook\Security\OutlookSecureTempFolder"

Value = WshShell.RegRead(Path)

 

'Variable mit Batch-Befehlszeile gefüllt (wird später in eine Batch-Datei geschrieben)

loeschen = "del """ + Value + "*.*"" /q"

 

'Erstellung der Batch-Datei, welche die Temporären Dateien löscht

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.CreateTextFile("c:\temp.bat")

 

'Füllen der Batch-Datei

objFile.WriteLine "@echo off"

objFile.WriteLine "echo Achtung, die Dateien aus folgendem Verzeichnis werden geloescht:"

objFile.WriteLine "echo."

objFile.WriteLine "echo " + Value

objFile.WriteLine "echo."

objFile.WriteLine "echo Abbrechen mit CTRL+C - weiter mit Enter"

objFile.WriteLine "echo."

objFile.WriteLine "Pause"

objFile.WriteLine "echo."

objFile.WriteLine "echo Bitte warten sie, bis die Dateien geloescht wurden!"

objFile.WriteLine(loeschen)

objFile.WriteLine "echo."

objFile.WriteLine "echo Fertig!"

objFile.WriteLine "echo."

objFile.WriteLine "pause"

objFile.WriteLine "del c:\temp.bat"

objFile.Close

 

'Erstellte Batch-Datei ausführen

WshShell.Run "c:\temp.bat"

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

 

Vielleicht bringt es ja jemand Anderen auch weiter!

 

Noch zu bemerken:

Die Batch-Datei muss nach dem Füllen wieder geschlossen werden, da sie sonst nicht ausgeführt werden kann!

Link zu diesem Kommentar
Die Batch-Datei löscht sich selbst ;) (Die letzten 3 Zeilen, welche ich zunächst auskommentierte zeigt, was in diese Batch-Datei geschrieben wird)

 

Danke für deine Infos!

 

Hier noch das komplette Script so wie ich es bisher habe - funktionsfertig:

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

Dim Path

Dim Value

Dim WshShell

Dim loeschen

 

Set WshShell = CreateObject("Wscript.Shell")

 

'Aus Registry auslesen, wo die Temporären Dateien liegen

Path = "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Outlook\Security\OutlookSecureTempFolder"

Value = WshShell.RegRead(Path)

 

'Variable mit Batch-Befehlszeile gefüllt (wird später in eine Batch-Datei geschrieben)

loeschen = "del """ + Value + "*.*"" /q"

 

'Erstellung der Batch-Datei, welche die Temporären Dateien löscht

Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFile = objFSO.CreateTextFile("c:\temp.bat")

 

'Füllen der Batch-Datei

objFile.WriteLine "@echo off"

objFile.WriteLine "echo Achtung, die Dateien aus folgendem Verzeichnis werden geloescht:"

objFile.WriteLine "echo."

objFile.WriteLine "echo " + Value

objFile.WriteLine "echo."

objFile.WriteLine "echo Abbrechen mit CTRL+C - weiter mit Enter"

objFile.WriteLine "echo."

objFile.WriteLine "Pause"

objFile.WriteLine "echo."

objFile.WriteLine "echo Bitte warten sie, bis die Dateien geloescht wurden!"

objFile.WriteLine(loeschen)

objFile.WriteLine "echo."

objFile.WriteLine "echo Fertig!"

objFile.WriteLine "echo."

objFile.WriteLine "pause"

objFile.WriteLine "del c:\temp.bat"

objFile.Close

 

'Erstellte Batch-Datei ausführen

WshShell.Run "c:\temp.bat"

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

 

Vielleicht bringt es ja jemand Anderen auch weiter!

 

Noch zu bemerken:

Die Batch-Datei muss nach dem Füllen wieder geschlossen werden, da sie sonst nicht ausgeführt werden kann!

 

Statt mit der Bat-Datei müsste es aber auch wie folgt funktionieren:

 

DIM fso

 

Set fso = CreateObject("Scripting.FileSystemObject")

fso.DeleteFolder(value, true)

 

Set fso = nothing

 

 

Gruß

 

Notesuser3

Link zu diesem Kommentar

was sagt diese Zeile aus?

 

Set fso = nothing

 

Ich dacht mirs auch schon, dass es jetzt im Endeffekt besser gewesen wäre, das ganz über VBS zu lösen, aber wenn so auch geht ;)

 

Und das Verzeichnis selbst darf ja nicht gelöscht werden, sondern nur die Dateien!

Hmmm... Wenn man danach das Verzeichnis einfach wieder neu erstellt? Dann könnte man das natürlich auch machen!

Link zu diesem Kommentar

Set fso = nothing leert das FSO Objekt. Kann man auch weglassen. Bei längeren Programm kann es aber sinnvoll sein, insbesondere wenn man die Variable vielleicht in anderen Programmteilen wieder verwende möchte und eventuell dann ein anderer Wert drin stehen soll. Ist so eine Angewohnheit aus Access-Zeiten.

 

Mit fso.DeleteFile DateiName (bei Dir Value?) kann auch eine bestimmte Datei gelöscht werden.

 

Sicherlich geht es auch mit dem Batch. Aber so wie ich Dich verstanden habe wolltest Du doch eine Lösung für VB-Skript. Außderdem geht es schneller und er Code ist kürzer.

 

Gruß

 

Notesuser3

Link zu diesem Kommentar

Hab das jetzt noch so ausprobiert:

 

Dim Path

Dim Value

Dim WshShell

Dim FSO

 

Set WshShell = CreateObject("Wscript.Shell")

 

Path = "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Outlook\Security\OutlookSecureTempFolder"

Value = WshShell.RegRead(Path)

 

Set FSO = CreateObject("Scripting.FileSystemObject")

FSO.DeleteFolder (Value, true)

 

die letzte Zeile darf keine Klammer enthalten (Beim Aufrufen einer Unterroutine dürfen keine Klammern verwendet werden).

Also, Klammer weg - Ergebnis:

Zeile 12 - Zeichen 1 - Der Pfad wurde nicht gefunden!

???

Link zu diesem Kommentar

Also Du kannst z.B. den Ordner durchlaufen und jede Datei in diesem Ordner löschen.

 

Dim fso

Dim fs

 

Set Fso = CreateObject("Scripting.FileSystemObject")

fso.GetFolder(value)

IF fso.Files.Count <> 0 Then

for each fs in fso.Files

fso.DeleteFile(value, true)

NEXT

END IF

 

So müsste der Code aussehen. Ich habe Ihn jetzt nicht getestet, aber es dürfte der richtig Ansatz sein.

 

 

Gruß

 

Notesuser3

Link zu diesem Kommentar
Hab das jetzt noch so ausprobiert:

 

Dim Path

Dim Value

Dim WshShell

Dim FSO

 

Set WshShell = CreateObject("Wscript.Shell")

 

Path = "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Outlook\Security\OutlookSecureTempFolder"

Value = WshShell.RegRead(Path)

 

Set FSO = CreateObject("Scripting.FileSystemObject")

FSO.DeleteFolder (Value, true)

 

die letzte Zeile darf keine Klammer enthalten (Beim Aufrufen einer Unterroutine dürfen keine Klammern verwendet werden).

Also, Klammer weg - Ergebnis:

Zeile 12 - Zeichen 1 - Der Pfad wurde nicht gefunden!

???

 

Lasse Dir mal die Variable Value in einer MsgBox anzeigen. Was steht darin?

 

Gruß

 

Notesuser3

Link zu diesem Kommentar

Damit funktioniert es:

 

Dim fso

Dim fs

DIM f

Set Fso = CreateObject("Scripting.FileSystemObject")

Set f = fso.GetFolder("C:\Test")

IF f.Files.Count <> 0 Then

for each fs in f.Files

fso.DeleteFile fs, true

NEXT

END IF

 

Lege Dir ein Paar Dateien in einem Ordner C:\Test an .

 

Und führe das Skript aus.

 

Danach musst du die Codeteile nur noch in deinem Skript verbauen.

 

Gruß

 

Notesuser3

Link zu diesem Kommentar

Super!

Damit geht es, hast Recht!

Hab es auch schon angepasst an den Pfad aus der Registry!

 

Dankeschön :)

 

Und wie das jetz genau funktoiniert, das muss ich mir einfach mal durchdenken, nachdem mir mit objekten usw einfach die Erfahrung und auch die Kenntnisse fehlen. Allgemeines Programmieren eben :suspect:

 

Hier der angepasste Code:

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

 

Dim Path

Dim Value

Dim WshShell

Dim FSO

Dim fs

DIM f

 

Set WshShell = CreateObject("Wscript.Shell")

 

'Aus Registry auslesen, wo die Temporären Dateien liegen

Path = "HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Outlook\Security\OutlookSecureTempFolder"

 

'Ausgelesenen Pfad in die Variable <Value> schreiben

Value = WshShell.RegRead(Path)

 

Set Fso = CreateObject("Scripting.FileSystemObject")

Set f = fso.GetFolder(Value)

 

If f.Files.Count <> 0 Then

 

For each fs in f.Files

 

FSO.DeleteFile fs, true

 

Next

 

END IF

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

 

Danke nochmals :)

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...