Запрос на выбор всех второстепенных временных файлов

Я пытаюсь написать скрипт для удаления ненужных временных файлов. Однако я хочу специально настроить таргетинг на .tmp. По крайней мере на данный момент. Итак, я пытаюсь написать запрос WQL, чтобы вернуть коллекцию, с которой я могу использовать оператор FOR EACH для удаления всех .tmp в C:\Users\\AppData\Local\Temp. Я только недавно начал изучать VBScript. Но у меня есть опыт написания программ на C/C++ (в основном "математических" программ).

У Cscript, похоже, нет проблем с самим запросом. Но когда я пытаюсь использовать метод Count для результирующей коллекции, cscript возвращает ошибку: (17,1) Ошибка времени выполнения Microsoft VBVScript: объект не поддерживает это свойство или метод: «colTempFiles.Count».

Я немного прочитал о WQL, думая, что, возможно, по какой-то причине мне не вернули коллекцию. Но я не могу найти ничего плохого в запросе. Я думаю, что, возможно, мне не следует выбирать из FileSystemObject. Но я прочитал все, что смог найти об этом, и мне кажется, что это правильно (хотя на самом деле в MSDN не так много полезной информации).

Во всяком случае, вот сценарий, который у меня сейчас есть, без комментариев. Вторая строка — это то, что я сейчас не использую, но собираюсь попробовать использовать позже, чтобы я мог определить переменную как имя пользователя локального компьютера и не указывать конкретно путь к локальной папке Temp. Любая помощь будет принята с благодарностью:

strComputer = "."
strUser="adam"


Set objFSO=CreateObject("Scripting.FileSystemObject")

Set objWMIService = GetObject("winmgmts:" _
 & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")


Set colTempFiles = objWMIService.ExecQuery _
 ("SELECT * FROM FileSystemObject WHERE Name = '*.tmp' AND "_
 & "NOT Name LIKE 'Prf%' AND Path LIKE 'C:\Users\adam\AppData\Local\Temp\%'")

colTempFiles.Count



For Each objFile in colTempFiles
Wscript.Echo objFile.Name
 'Set objF=objFSO.GetFile("objFile.Path")
 'objF.Delete(True)
Next

person Adam Harvey    schedule 04.08.2014    source источник


Ответы (1)


Я думаю, вы путаете две разные технологии. FileSystemObject — это COM-класс, экземпляр которого необходимо создать с помощью CreateObject() в VBScript. Для WQL необходимо использовать в запросе класс WMI. Вот основной список классов WMI. Для ваших целей вы захотите использовать класс CIM_DataFile для работы с файлами.

Вы можете использовать любую технологию. FileSystemObject является предпочтительным методом, если вы работаете с локальной файловой системой. Если вам нужно работать с файлами на удаленной машине, используйте WMI и WQL.

Вот пример использования FileSystemObject:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder("C:\Users\adam\AppData\Local\Temp")

For Each objFile In objFolder.Files
    If StrComp(objFSO.GetExtensionName(objFile.Path), "tmp", vbTextCompare) = 0 Then
        objFile.Delete    ' This is the Delete() method of the FSO's "File" class
    End If
Next

А вот пример с использованием WQL:

strComputer = "."

' Connect to the WMI service on the specified computer...
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

' Build our WQL query...
strQuery = "select * from CIM_DataFile "
strQuery = strQuery & "where Drive='C:' "
strQuery = strQuery & "and Path='\\Users\\adam\\AppData\\Local\\Temp\\' "
strQuery = strQuery & "and Name like '%.tmp'"

' Run the query...
Set colTempFiles = objWMIService.ExecQuery(strQuery)

' Delete each file...
For Each objFile In colTempFiles
    objFile.Delete    ' This is the Delete() method of the WMI "CIM_DataFile" class
Next
person Bond    schedule 04.08.2014
comment
Спасибо за помощь. Как я уже сказал, я только начал изучать VBScript. Поэтому я действительно не знал разницы между классами WMI и COM. Я просто собрал сценарий, основываясь на том, что я видел. Теперь он работает отлично. - person Adam Harvey; 05.08.2014