chapster
Goto Top

Ordnerinhalt löschen mit VBS

Hallo zusammen,

ich möchte bei der Abmeldung ein VB-Script starten, dass alle Dateien in C:\temp löscht.

Hab auch ein solches Script schon geschrieben aber in diesem Script lösche ich einfach den ganzen Ordner und erstelle ihn neu. Das funktioniert eigentlich recht gut, aber das Problem is wenn dateien schreibgeschützt sind oder keine Berechtigungen auf eine enthaltene datei besteht dann is natürlich alles fürn hintern.

Deswegen hab ich mir gedacht ich geh alle dateien, ordner und unterordner durch und schau mal ob die schreibgeschützt sind und ob ich die Berechtigungen hab, und wenn dies der Fall is, das ich die Berechtigungen irgendwie übernimm oder das Attribut schreibgeschützt aufhebe. Dazu müsst ich aber wissen wie ich das mach!

Falls einem von euch was einfällt: Please tell me!

Danke chapster

Content-ID: 50157

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

Ausgedruckt am: 23.11.2024 um 10:11 Uhr

Biber
Biber 29.01.2007 um 21:01:59 Uhr
Goto Top
Moin chapster,

grobe Skizze:
' ---------deltempFiles.vbs  
Dim File, fso, folder

'Dim tempDir  
'TempDir = "C:\Temp\"  
Set fso = CreateObject("Scripting.FileSystemObject")  
FackelAb "C:\temp"                ' oder TempDir oder Wscript.Arguments(0) ...  
Wscript.Quit
'------------schon zu Ende, der Schnipsel...*g  
Sub FackelAb( Strfolder)
Dim Folder, SubFolder
wscript.echo "----" & StrFolder  ' hier aus-kommentieren  
Set folder = fso.GetFolder(StrFolder)
For Each SubFolder in folder.SubFolders
    FackelAb SubFolder
Next    
For Each File in Folder.Files
    'File.Delete File.Name     ' Hier ent-kommentieren  
    WScript.echo "File.Delete " & File.Name   ' hier aus-kommentieren  
Next
End Sub

So in etwa... wobei es aufzurufen wäre mit...
cscript //nologo deltempFiles.vbs [vom CMD-Prompt]
oder halt per Doppelklick starten.

Für einen Aufruf vom CMD-Prompt spräche, dass Du das in der Skizze fest verdrahtete "C:\Temp"
besser als Parameter (Wscript.Arguments(0) ) übergeben könntest.

Ähnliche Beispiele findest Du aber auch schon hier im Forum...
...und eine Suche in einer der FileSystemObject-Syntax-Referenzen erklärt Dir die paar Befehle besser, als ich mir je anmaßen würde.
Deshalb war ich etwas sparsam mit Kommentaren.
...und weil ich stinkefaul bin *zugeb*

HTH
Biber
bastla
bastla 29.01.2007 um 21:10:25 Uhr
Goto Top
Hallo chapster!

Wenn es auch Batch sein dürfte, hätte ich folgenden Vorschlag:
Lege zunächst den Ordner C:\Temp neu an und setze die entsprechenden Sicherheitseinstellungen, die für neue Ordner/Dateien vererbt werden. Natürlich sollte dann dieser Ordner erhalten bleiben.
Daher weiter per Batch:
::Schreibschutz-, versteckt-, System-Attribut rücksetzen für alle Dateien
attrib C:\Temp\*.* /s /d -r -h -s
::alle Dateien ohne Rückfrage aus dem Ordner C:\Temp selbst löschen
del /q C:\Temp\*.*
::alle Unterverzeichnisse ohne Rückfrage löschen
for /f "delims=" %%i in ('dir C:\Temp /b /ad') do rd /s /q "%%i"  
Ev kannst Du die Durchführung noch beschleunigen, wenn Du das Löschen der Dateien und Unterverzeichnisse einmal vorweg durchführst und nur für die verbliebenen schreibgeschützten (etc) Dateien den attrib-Befehl durchlaufen lässt - danach natürlich nochmals die beiden Löschbefehle ...

Grüße
bastla
bastla
bastla 29.01.2007 um 21:14:03 Uhr
Goto Top
@Biber

Das wäre übrigens ein klassischer Fall für ein "On Error Resume Next" (wegen der ev Rechteprobleme ...)

Grüße
bastla
Biber
Biber 29.01.2007 um 21:26:33 Uhr
Goto Top
@bastla
Das wäre übrigens ein klassischer Fall für ein "On Error Resume Next"
Stimmt, aber dieses "On Error goto SchwammDrüber" fand ich schon bei meinen ersten zarten Berührungsversuchen mit VBScript so...
<*nach Worten ring*>...
egal - ich nutze es höchst ungern.

Aber in diesem Fall...also ein mit Sicherheit grenzender Wahrscheinlichkeit auftretender "Fehler",
der mir/chapster wirklich egal ist... da wäre es okay.

Allerdings würde ich dann im Batch auch die Fehlermeldungen mit "2>nul" an dieselbe Stelle umleiten face-wink

Grüße
Biber
bastla
bastla 29.01.2007 um 22:37:16 Uhr
Goto Top
@Biber

... auch die Fehlermeldungen mit "2>nul" an dieselbe Stelle umleiten
... wobei sie aber in diesem Fall vielleicht doch (zur Lokalisierung der Überbleibsel) nützlich sein könnten ...

Zumindest für die angedachte Variante des "Vorweg-Abräumens" hast Du aber natürlich wieder einmal Recht.
Wenn ich noch ein wenig verfeinern dürfte:
' ---------deltempFiles.vbs  
Dim File, fso, folder

'Dim tempDir  
'TempDir = "C:\Temp\"  
Set fso = CreateObject("Scripting.FileSystemObject")  
<b>TorchTheBloody</b> "C:\temp"                ' oder TempDir oder Wscript.Arguments(0) ...  
Wscript.Quit
'------------schon zu Ende, der Schnipsel...*g  
Sub <b>TorchTheBloody</b>( Strfolder)
<b>On Error Resume Next</b>
Dim Folder, SubFolder
wscript.echo "----" & StrFolder  '  hier aus-kommentieren  
Set folder = fso.GetFolder(StrFolder)
For Each SubFolder in folder.SubFolders
    <b>TorchTheBloody</b> SubFolder
    'Schreibschutz entfernen (obwohl für Folder anscheinend nicht unbedingt erforderlich)  
    <b>'If Folder.Attributes And 1 Then Folder.Attributes = Folder.Attributes - 1</b>  'hier ent-kommentieren  
    <b>'SubFolder.Delete</b>   'hier ent-kommentieren  
Next    
For Each File in Folder.Files
    WScript.echo "File.Delete " & File.Name   ' hier aus-kommentieren  
    <b>'If File.Attributes And 1 Then File.Attributes = File.Attributes - 1</b> 'Schreibschutz entfernen; hier ent-kommentieren  
    'File.Delete     ' Hier ent-kommentieren  
Next
End Sub

Grüße
bastla

[Edit] SETZEN: TorchTheBloody umgesetzt face-big-smile [/Edit]
Biber
Biber 29.01.2007 um 22:49:32 Uhr
Goto Top
Jepp, bastla,

so macht das schon einen etwas seriöseren Eindruck...

Ich bin auch bereit (als kleines Zugeständnis an das in Englisch wirklich besser lesbarere Progrämmchen) auch die "Sub FackelAb" umzubenennen.

Das müsste auf ausländisch "to torch something" heißen...

Also sollten wir an den drei Stellen

STREICHEN: FackelAb "C:\temp" / Sub FackelAb (strFolder) / FackelAb SubFolder
SETZEN: TorchTheBloody "C:\temp" / Sub TorchTheBloody (strFolder) / TorchTheBloody SubFolder

...dann macht es einen richtig "runden" Eindruck... face-wink

Grüße
Biber
[Edit] @chapster
Also nochmal das Problem:
Das Script soll alle Dateien im Ordner C:\temp löschen!
Das geht nie nicht. Punkt.
Dazu hab ich schon mal hier in einem ähnlichen Thread "Alle Dateien im Temp-Verzeichnis löschen" oder so gaaaaaaaaaaaaaanz viel geschrieben.

Alle geht nicht, weil
- immer ein Dutzend in Gebrauch/gesperrt ist
- immer noch und immer wieder ein paar Nasen Spezialisten in den Temp-Ordner dauerhafte Konfig-Infos und Serien-Nummern und Install-Pfade hinterlegen, die natürlich dann schreibgeschützt werden...
Die unter Fall a) erwischt Du beim nächsten Mal... morgen oder übermorgen...was solls.
Die unter Fall b) solltest Du nicht um jeden Preis wegknallen.
[/Edit]
P.S. Thx, bastla face-big-smile face-big-smile face-big-smile
chapster
chapster 29.01.2007 um 22:50:35 Uhr
Goto Top
Vielen, vielen Dank für den Code!

War auch fast richtig so, nur File.Delete wird nicht hin hauen, sollte dann wahrscheinlich so ausschauen:
fso.DeleteFile Strfolder & "\" & File.Name

Meins hat eh ziemlich ähnlich ausgeschaut, aber das Problem das weiterhin besteht ist, dass das Script, wenn ich keine Berechtigungen hab oder eine Datei schreibgeschützt ist, eine Fehlermeldung hervor ruft.

Also nochmal das Problem:
Das Script soll alle Dateien im Ordner C:\temp löschen!
Also muss ich jede einzelne Datei lesen, gucken ob diese schreibgeschützt ist oder ob ich berechtigungen darauf habe und dann löschen.
Hat diese datei einen Schreibschutz soll dieser Aufgehoben werden und danach die datei gelöscht werden.
Habe ich keine Berechtigungen die Datei zu löschen sollen die Berechtigungen übernommen werden und die datei danach gelöscht werden.

So ich glaub jetzt hab ichs ziemlich eindeutig beschrieben.
Außerdem such ich eh schon ganze Zeit nach so ner Lösung aber, ich glaub das mit den Berechtigungen übernhemen wird nicht hin hauen.

Falls trotzdem noch wem was einfällt, bitte schreibt mir nochmal.

Danke

!*!*!*!*!*!*!*!
special thanks to Biber for the Script again
bastla
bastla 29.01.2007 um 23:04:13 Uhr
Goto Top
nur File.Delete wird nicht hin hauen
... wird es doch.

Hat diese datei einen Schreibschutz soll dieser Aufgehoben werden und danach die datei gelöscht werden.
... siehe unten.

Habe ich keine Berechtigungen die Datei zu löschen sollen die Berechtigungen übernommen werden und die datei danach gelöscht werden ... aber, ich glaub das mit den Berechtigungen übernhemen wird nicht hin hauen.
Vielleicht versuchst Du doch meinen Vorschlag von vorhin (Rechte vorweg setzen und damit vererben lassen; C:\Temp selbst bleibt ja in der aktuellen Version bestehen) - oder Du schlägst Dich zB mit "xcacls" herum.

Grüße
bastla
chapster
chapster 29.01.2007 um 23:15:52 Uhr
Goto Top
Sorry!

File.Delete geht logischerweise eh, nur das File.Name dahinter hat mich iritiert.

Und der Vorschlag mit den Berechtigungen is sehr gut, das werd ich so machen!

Also nochmal vielen, vielen Dank

euer chapster
chapster
chapster 29.01.2007 um 23:29:38 Uhr
Goto Top
Sodala!

Stimmt alle werd ich eh nie weg kriegen, na egal trotzdem vielen vielen dank an euch beide:

Und für alle die mal da rein schaun sollten und das auch haben wollen aber keine ahnung haben was sie jetzt auskommentieren sollen und was nicht hab ichs nochmal zamgschrieben. So wies is funktionierts und besser wird wahrscheinlich eh nie gehen.


Dim fso

Set fso = CreateObject("Scripting.FileSystemObject")
Delete "C:\temp"
Wscript.Quit

Sub Delete( Strfolder)
On Error Resume Next
Dim Folder
Set Folder = fso.GetFolder(StrFolder)

For Each SubFolder in Folder.SubFolders
Delete SubFolder
If Folder.Attributes And 1 Then
Folder.Attributes = Folder.Attributes - 1
end if
SubFolder.Delete
Next

For Each File in Folder.Files
If File.Attributes And 1 Then
File.Attributes = File.Attributes - 1
End If
File.Delete
Next
End Sub