
Tengo cientos de computadoras con problemas de espacio y, últimamente, he estado ejecutando PSExec en cada computadora en esta lista y realizando un "del /s /qc:\DIRECTORY*" en cada máquina, lo cual es simplemente ridículo.
Encontré un script VB que consulta un archivo ComputerList.txt que podía modificar con una lista de todos los nombres de host de todas las computadoras en cuestión, y luego otro FolderList.txt donde podía enumerar todos los directorios para vaciar.
Excepto que el script no funciona y de todos modos elimina una carpeta de un directorio. Lo cual, por supuesto, quiero eliminar todos los elementos de una carpeta. No eliminar la carpeta en sí.
La funcionalidad que me gustaría es que VBScript consulte el archivo ComputerList.txt, que tiene todos los nombres de host para modificar. Luego eliminaría todos los archivos en los directorios enumerados en el archivo FoldersList.txt. Saltar todos los archivos que están en uso o nombres de host que mis derechos no administran. Sería ideal si una lista de nombres de host que se omitieron debido a derechos o por estar fuera de línea se exportara a un archivo TXT para poder consultarlos.
Si alguien pudiera ayudarme con esto, ¡sería fantástico! Gracias a todos. Aquí está el guión que tengo:
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