halo7one
Goto Top

Datei(en) per VBS in den Papierkorb verschieben

Hi @ all,
ich möchte mit einem VB-Script mehrere Dateien in den Papierkorb verschieben, damit man sie bequem wiederherstellen kann, falls nötig.
Ich habe diesbezüglich zwar eine Funktion für VB, VBA oder ähnliches gefunden, jedoch nirgens etwas für VBS!

Hier ist die gefundene Funktion für VB: http://www.aboutvb.de/khw/artikel/khwshellkill.htm

Ich hoffe, dass mir jemand eine einen Weg in VBS zeigen kann, bzw. die Funktion umschreiben kann (auch wenn so weit ich weiß ein großer Unterschied zwischen VB und VBScript besteht).

halo7one

Content-Key: 84248

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

Printed on: April 25, 2024 at 17:04 o'clock

Member: bastla
bastla Mar 30, 2008 at 18:05:49 (UTC)
Goto Top
Hallo halo7one!

Der angesprochene Unterschied zeigt sich zB in der Tatsache, dass VBS keine API-Calls durchführen kann - insoferne wird ein Umschreiben etwas schwierig sein.
Alternativ dazu habe ich versucht, den Papierkorb ("Recycle Bin") per "Namespace" anzusprechen - das klappt zwar zB hinsichtlich des Auslesen der Inhalte (Beispiel unten), ein "MoveHere" führt allerdings nicht zum gewünschten Erfolg.

'Papierkorb-Info.vbs  
Set objShell = CreateObject("Shell.Application")  
Set Papierkorb = objShell.Namespace(10)

With Papierkorb
	WScript.Echo "Pfad (ID): " & .Self.Path  
	WScript.Echo "Anzahl gelöschter Elemente: " & .Items.Count  
	WScript.Echo vbCrLF & "Liste gelöschter Elemente:"  
	For Each Element In .Items
		WScript.Echo Element.Name
	Next
End With
Vielleicht findest Du ja in dieser Richtung noch etwas Brauchbares ...
Ein möglicher Weg zum Löschen unter Verwendung des Papierkorbs ist hier (unter der falschen Überschrift "How can I empty the recycle bin?") beschrieben - es wird das Kontextmenü einer Datei (eines Ordners) verwendet, was dann angepasst etwa so aussehen könnte:
If WScript.Arguments.Count > 0 Then
	Set oWinShell = CreateObject("Shell.Application")  
	Set oFS = CreateObject("Scripting.FileSystemObject")  

	If oFS.FileExists(WScript.Arguments(0)) Then
		Set F = oFS.GetFile(WScript.Arguments(0))
	ElseIf oFS.FolderExists(WScript.Arguments(0)) Then
		Set F = oFS.GetFolder(WScript.Arguments(0))
	Else
		WScript.Quit
	End If
	
	Set oSHFolder = oWinShell.Namespace(oFS.GetParentFolderName(F.Path))
	Set oSHFItems = oSHFolder.Items
	Set oSHFItem = oSHFItems.Item(F.Name)
	
	oSHFItem.InvokeVerb("&Löschen")  
	
	Set F = Nothing
	Set oWinShell = Nothing
	Set oSHFolder = Nothing
	Set oSHFItems = Nothing
	Set oSHFItem = Nothing
End If
Allerdings ist das vermutlich nicht nur, wenn es um eine größere Anzahl von Dateien geht, kein besonders attraktiver Ansatz (ev könntest Du versuchen, vorweg die im Kontextmenü des Papierkorbes / Register "Global" zu findende Option “Dialog zur Bestätigung des Löschvorgangs anzeigen” über die Registry vorübergehend zu deaktivieren - etwa hier beschrieben, allerdings nicht von mir getestet) ...

Grüße
bastla
Member: misterdemeanor
misterdemeanor Apr 01, 2008 at 02:56:52 (UTC)
Goto Top
Hallo halo7one, bastla,

@halo7one
Wie bastla schon bemerkte ist der von Dir erwähnte Lösungsweg ein API-Call und somit nicht aus vbs durchführbar

@bastla
Sehr schönes Workaround! Aber unglaublich das es keine direkte Möglichkeit gibt Dateien in den Pabierkorb zu verschieben.
Hatte jetzt nur halbherzig gegoogled (geht das als neudeutsch durch?)...was ich meine festhalten zu können:
  • Es gibt tatsächlich "ein" richtiges Verzeichnis in welches die gelöschten Dateien vor endgültigem löschen des MFT Records verschoben werden. Dieses ist abhängig von der Windows-Version sowie des Dateisystems (FAT[32] / NTFS) MSDN:How the Recycle Bin Stores Files
  • Nachdem verschieben in dieses Verzeichnis wird die Datei nach einem bestimmten Schema umbenannt. (Siehe Link oben oder hier
  • Im Pabierkorb-Verzeichnis existiert eine Datei namens "INFO2" ("INFO" bei Win95 FAT). Diese Datei hält die Informationen über die "gelöschten" Dateien-->Speicherort vor Löschung, Größe, "Löschdatum" und ID. ID ist hier der Index der Datei im Papierkorb, vergeben wenn Datei im Paierkorb verschoben wurde. Diese Datei sollte der Schlüssel zur Lösung des Problemes sein.
Forensic Analysis of Microsoft Windows Recycle Bin Records by Keith J. Jones

Wenn es also gelingt korrekte INFO2-File Einträge zu erstellen, ist das verschieben und umbenennen der zu "löschenden" Dateien nur noch ein Klacks.
Nötig dazu wären :
  • auf NTFS Volumes die SID des Users
  • den Originalpfad der Datei
  • die Größe der Datei
  • die UTC Zeit des Verschiebevorganges im Windows TIMESTAMP-Format

Das ganze ist sicher nicht trivial, aber theoretisch sollte es möglich sein.
Vielleicht findet sich ja jemand der das ganze gerne erarbeiten möchte.

BG, Felix -misterdemeanor- Bahrenburg
Member: halo7one
halo7one Apr 01, 2008 at 15:46:52 (UTC)
Goto Top
!!! Vielen Dank für eure schnellen Antworten & Ideen !!!

@bastla: THX!
Auch wenn dein Vorschlag bei vielen Dateien in verschiedenen Ordnern wirklich zu Problemen führen wird, wird es wohl die einfachste Methode sein und ist somit einen Versuch allemal wert.

@misterdemeanor: TY!
Wenn es jemand schafft, die richtigen Einträge zu generieren, ist dieser Weg allein schon wegen dem direkten Schreiben der Einträge interessant und bei vielen Dateien eindeutig besser,
jedoch muss ich dann wohl auch auf jemanden hoffen, der mehr Ahnung davon hat als ich, was das Programmieren angeht ;)

Falls jemand die "Papierkorb-Einträge" hinbekommt oder noch eine andere Idee hat: HER DAMIT face-smile
MfG,
halo7one