
У меня сотни компьютеров с проблемами свободного места, и в последнее время я просто запускаю PSExec на каждом компьютере из этого списка и выполняю «del /s /qc:\DIRECTORY*» на каждой машине, что просто смешно.
Я нашел скрипт VB, который запрашивает файл ComputerList.txt, который я мог бы изменить, добавив в него список всех имен хостов всех рассматриваемых компьютеров, а затем еще один файл FolderList.txt, в котором я мог бы перечислить все каталоги, которые нужно очистить.
За исключением того, что скрипт не работает и удаляет папку для каталога в любом случае. Что, конечно, я хочу удалить все элементы в папке. А не удалить саму папку.
Функциональность, которую я хотел бы получить, заключается в том, что VBScript запросит файл ComputerList.txt, в котором есть все имена хостов для изменения. Затем он удалит все файлы в каталогах, перечисленных в файле FoldersList.txt. Пропустив все файлы, которые используются, или имена хостов, которые не администрируются моими правами. Было бы идеально, если бы список имен хостов, которые были пропущены из-за прав или отсутствия в сети, был бы экспортирован в файл TXT, чтобы я мог ссылаться на них.
Если бы кто-нибудь мог мне с этим помочь, это было бы здорово! Спасибо всем. Вот скрипт, который у меня есть:
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