
Ich habe Hunderte von Computern mit Speicherplatzproblemen und in letzter Zeit habe ich einfach auf jedem Computer in dieser Liste ein PSExec ausgeführt und auf jedem Rechner ein „del /s /qc:\DIRECTORY*“ ausgeführt, was einfach lächerlich ist.
Ich habe ein VB-Skript gefunden, das eine ComputerList.txt-Datei abfragt, die ich mit einer Liste aller Hostnamen aller in Frage kommenden Computer ändern könnte, und dann eine weitere FolderList.txt, in der ich alle zu leerenden Verzeichnisse auflisten könnte.
Außer, dass das Skript nicht funktioniert und trotzdem einen Ordner für ein Verzeichnis löscht. Dabei möchte ich natürlich alle Elemente in einem Ordner löschen. Nicht den Ordner selbst löschen.
Die Funktion, die ich mir wünsche, ist, dass das VBScript die Datei ComputerList.txt abfragt, die alle zu ändernden Hostnamen enthält. Dann löscht es alle Dateien in den Verzeichnissen, die in der Datei FoldersList.txt aufgelistet sind. Dabei werden alle Dateien übersprungen, die gerade verwendet werden, oder Hostnamen, die nicht durch meine Rechte verwaltet werden. Es wäre ideal, wenn eine Liste der Hostnamen, die aufgrund von Rechten oder Offline-Zugriff übersprungen wurden, in eine TXT-Datei exportiert würde, damit ich darauf zurückgreifen kann.
Wenn mir jemand dabei helfen könnte, wäre das großartig! Vielen Dank an alle. Hier ist das Skript, das ich habe:
Option Explicit
Const strFolderList = "C:\Scripts\FolderList.txt"
Const strComputers = "C:\Scripts\ComputerList.txt"
Dim objFSO, inFile, ComputerList, objDictionary, strFolderName, colfolders, intSize
Dim arrFolders(), objWMIService, intKey, Item, colSubfolders
intSize = 0
Set objFSO = CreateObject("scripting.filesystemobject")
Set inFile = objFSO.OpenTextFile(strFolderList,1)
Set ComputerList = objFSO.OpenTextFile(strComputers,1)
Set objDictionary = CreateObject("Scripting.Dictionary")
'---------Read folderlist into an Dictionary Array---------
intkey = 1
Do Until inFile.AtEndOfStream
objDictionary.Add intKey, inFile.ReadLine
intKey = intKey + 1
Loop
inFile.Close
'-----------------------------------
'----Read computerlist line by line and call FileDelete
Do Until ComputerList.AtEndOfStream
Call FileDelete(computerlist.ReadLine)
WScript.Echo "Done."
Loop
ComputerList.Close
'-----Uses the computer name above and connects to WMI
Sub FileDelete(strComputer)
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate,authenticationLevel=Pkt}!\\" _
& strComputer & "\root\cimv2")
'---loop through the dictionary array and delete folders
For Each Item In objDictionary.Items
strFolderName = Item
Set colSubfolders = objWMIService.ExecQuery _
("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
& "Where AssocClass = Win32_Subdirectory " _
& "ResultRole = PartComponent")
ReDim Preserve arrFolders(intSize)
arrFolders(intSize) = strFolderName
intSize = intSize + 1
On Error Resume Next
For Each objFolder in colSubfolders
'Folder does not exist
If Hex(Err.Number) = 80041002 Then
Err.Clear
WScript.Echo strFolderName & " does not exist."
Else
'folder exists
GetSubFolders strFolderName
End If
Next
For i = Ubound(arrFolders) to 0 Step -1
strFolder = arrFolders(i)
strFolder = Replace(strFolder, "\", "\\")
Set colFolders = objWMIService.ExecQuery _
("Select * from Win32_Directory where Name = '" & strFolder & "'")
For Each objFolder in colFolders
errResults = objFolder.Delete
Next
Next
Next
End Sub
Sub GetSubFolders(strFolderName)
Set colSubfolders2 = objWMIService.ExecQuery _
("Associators of {Win32_Directory.Name='" & strFolderName & "'} " _
& "Where AssocClass = Win32_Subdirectory " _
& "ResultRole = PartComponent")
For Each objFolder2 in colSubfolders2
strFolderName = objFolder2.Name
ReDim Preserve arrFolders(intSize)
arrFolders(intSize) = strFolderName
intSize = intSize + 1
GetSubFolders strFolderName
Next
End Sub