Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также любые проблемы программирования на различных макроязыках и в скриптовых средах)

Рецепты WMI: работа с файловой системой

Примеры кода в статье приводятся на языке VBScript для административных сценариев Windows. Приведённые ниже примеры не исчерпывают всех возможностей классов, которые в них упоминаются (используются). Для получения полной информации обращайтесь к MSDN. Как правило, поиск в MSDN названия того или иного класса позволяет быстро получить перечень (описание) всех его свойств и методов.

Работа с файловой системой в скриптах возможна как с помощью WSH-объекта FileSystemObject, так и с помощью WMI. Преимущества WMI перед объектом FileSystemObject заключаются в следующем:

Преимущества FileSystemObject перед WMI заключаются в следующем:

Класс Win32_DiskPartition

Класс Win32_DiskPartition позволяет получить информацию о всех разделах физического жёсткого диска. Пример получения информации:

On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
For Each objDP In objService.ExecQuery("SELECT * FROM  Win32_DiskPartition")
	WScript.Echo objDP.Caption 'краткое описание раздела
	WScript.Echo objDP.Name 'имя раздела
	WScript.Echo objDP.DeviceID 'строковый уникальный идентификатор раздела
	WScript.Echo objDP.Description 'описание раздела
	WScript.Echo objDP.Type 'описание раздела
	WScript.Echo objDP.DiskIndex 'номер диска, содержащего данный раздел
	WScript.Echo objDP.Index 'номер данного раздела
	WScript.Echo objDP.Bootable 'признак загрузочного раздела (булево)
	WScript.Echo objDP.BootPartition 'признак активности раздела (булево)
	'(операционная система использует активный раздел для загрузки с жесткого диска)
	WScript.Echo objDP.PrimaryPartition 'признак первичного (основного загрузочного) раздела (булево)
	WScript.Echo objDP.BlockSize 'размер блока в байтах
	WScript.Echo objDP.NumberOfBlocks 'общее число блоков в разделе.
	'Размер раздела может быть вычислен путем умножения значений свойств NumberOfBlocks и BlockSize.
	WScript.Echo objDP.Size 'размер раздела в байтах
	WScript.Echo objDP.StartingOffset 'начальное смещение раздела в байтах
	WScript.Echo objDP.SystemName 'имя компьютера
	WScript.Echo
Next

Класс Win32_LogicalDisk

Класс Win32_LogicalDisk позволяет получить информацию как о локальных, так и о подключённых сетевых логических дисках. Однако, рекомендуется использовать этот класс для получения сведений о локальных логических дисках, а для получения сведений о подключённых сетевых дисках использовать класс Win32_MappedLogicalDisk, аналогичный по составу свойств. Пример получения информации:

On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
For Each objDP In objService.ExecQuery("SELECT * FROM  Win32_LogicalDisk")
	WScript.Echo objDP.Caption 'краткое описание
	WScript.Echo objDP.Name 'имя диска
	WScript.Echo objDP.DeviceID 'уникальный идентификатор диска
	WScript.Echo objDP.Description 'описание типа диска
	WScript.Echo objDP.DriveType 'численное значение, соответствующее типу дискового накопителя:
	'0 Unknown
	'1 No Root Directory
	'2 Removable Disk
	'3 Local Disk
	'4 Network Drive
	'5 Compact Disc
	'6 RAM Disk
	WScript.Echo objDP.Compressed 'указывает, рассматривается ли логический диск системой
	'как единый сжатый объект, например, как том DoubleSpace; если поддерживается пофайловое
	'сжатие (как для NTFS), значение свойства равно FALSE.
	WScript.Echo objDP.FileSystem 'тип файловой системы
	WScript.Echo objDP.FreeSpace 'доступное свободное место в байтах
	WScript.Echo objDP.Size 'размер логического диска в байтах
	WScript.Echo objDP.MaximumComponentLength 'содержит максимальную длину имени файла, поддерживаемую
	'накопителем. Значение может быть использовано для указания того, что длинные имена поддерживаются данной
 	'файловой системой. Например, для файловой системы FAT32, поддерживающей длинные имена, это свойство хранит
 	'значение 255.
 	WScript.Echo objDP.ProviderName 'сетевой путь к подключённому сетевому диску
 	WScript.Echo objDP.SystemName 'имя компьютера
 	WScript.Echo objDP.VolumeName 'метка тома
 	WScript.Echo objDP.VolumeSerialNumber 'серийный номер тома логического диска
	WScript.Echo
Next

Класс Win32_Directory

Класс Win32_Directory представляет папку в системе Win32. Папка является разновидностью файла, логически группирующей файлы данных. Примечание: корневой каталог диска (например, "c:\") также является папкой. Вот описание некоторых свойств класса (все свойства - только для чтения):


СвойствоОписание
Caption
Name
Description
Краткое описание объекта. Фактически - путь без завершающего слеша (для корневого каталога - с завершающим слешем).
Path Путь к родительскому каталогу с завершающим слешем без буквы диска. Например, для папки "C:\WINDOWS\system32" это будет "\WINDOWS\". Для папки "C:\WINDOWS" - "\". Для папки "C:\" - пустая строка.
EightDotThreeFileName Полный путь с DOS-совместимым именем папки. Например, для папки "c:\documents and settings\all users" это будет "c:\documents and settings\alluse~1". Для корневого каталога - пустая строка.
Drive Буква диска с двоеточием.
FileName Имя папки. Например, для папки "c:\documents and settings" это будет "Documents and Settings". Для корневого каталога - пустая строка.
Extension Расширение имени папки. Например, для папки "c:\myfolder.zyx" это будет "zyx".
CreationDate Дата и время создания папки. Для корневого каталога - Null.
LastAccessed Дата и время последнего доступа к папке. Для корневого каталога - Null.
Compressed Булево значение, указывающее на то, что папка была сжата. Для корневого каталога - Null.
Hidden Булево значение, указывающее на атрибут папки "скрытый". Для корневого каталога - Null.
System Булево значение, указывающее на атрибут папки "системный". Для корневого каталога - Null.
Writeable Булево значение, указывающее на то, что папка может быть записана. Для корневого каталога - Null.
Archive Булево значение, указывающее на атрибут папки "архивный" (папка готова для архивирования). Для корневого каталога - Null.
FileType Строка, описывающая тип файла по его расширению (по данным реестра). Для папок - всегда "File Folder" или подобное. Для корневого каталога - "Local Disk".
FSName Тип файловой системы. Например, "NTFS".
CSName Имя компьютера.

Следующий сценарий выводит дату создания всех папок на всех дисках, в название которых входит слово "Документы" с маленькой или с большой буквы. Примечание: объект "WbemScripting.SWbemDateTime" применяется для конвертации даты в более удобный формат.

On Error Resume Next
Set objDateTime = CreateObject("WbemScripting.SWbemDateTime")
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
Set colFolders = objService.ExecQuery("SELECT * FROM  Win32_Directory WHERE " & _
	"FileName LIKE '%[Дд]окументы%'")
For Each objFolder In colFolders
	WScript.Echo objFolder.Name
	objDateTime.Value = objFolder.CreationDate
	WScript.Echo objDateTime.GetVarDate
	WScript.Echo
Next

Описание некоторых методов класса Win32_Directory:


МетодОписание
Copy(string FileName) Рекурсивно копирует каталог к местоположению, указанному во входном параметре (указывается полный путь к каталогу без завершающего слеша). Перезапись (overwriting) существующего каталога не поддерживается (если каталог назначения существует, никаких действий произведено не будет).
Rename(string FileName) Переименовывает папку. Во входном параметре указывается полный путь. Перезапись (overwriting) существующего каталога не поддерживается (если каталог назначения существует, никаких действий произведено не будет).
Delete() Удаляет папку. Папка НЕ попадает в корзину.
Compress() Сжимает папку.
Uncompress() Распаковывает папку.
CopyEx(string FileName, string StopFileName, string StartFileName, boolean Recursive) Копирует каталог. Перезапись (overwriting) существующего каталога не поддерживается (если каталог назначения существует, никаких действий произведено не будет). Параметры:
  • FileName - полный путь к каталогу назначения без завершающего слеша.
  • StopFileName - выходной параметр. Имя файла/каталога, на котором метод потерпел неудачу. Этот параметр будет содержать Null, если метод завершён успешно.
  • StartFileName - необязательный параметр. Дочерний каталог, который используется как отправная точка для копирования. Как правило, здесь указывается путь к каталогу, на котором метод потерпел неудачу в прошлый раз (т.е. этот параметр используется при повторной попытке копирования каталога).
  • Recursive - необязательный параметр. Если указано True, операция производится рекурсивно (с подкаталогами).
DeleteEx(string StopFileName, string StartFileName) Удаляет папку. Папка НЕ попадает в корзину. Параметры:
  • StopFileName - выходной параметр. Имя файла/каталога, на котором метод потерпел неудачу. Этот параметр будет содержать Null, если метод завершён успешно.
  • StartFileName - необязательный параметр. Дочерний каталог, который используется как отправная точка для удаления. Как правило, здесь указывается путь к каталогу, на котором метод потерпел неудачу в прошлый раз (т.е. этот параметр используется при повторной попытке удаления каталога).
CompressEx(string StopFileName, string StartFileName, boolean Recursive) Сжимает папку. Параметры:
  • StopFileName - выходной параметр. Имя файла/каталога, на котором метод потерпел неудачу. Этот параметр будет содержать Null, если метод завершён успешно.
  • StartFileName - необязательный параметр. Дочерний каталог, который используется как отправная точка для сжатия. Как правило, здесь указывается путь к каталогу, на котором метод потерпел неудачу в прошлый раз (т.е. этот параметр используется при повторной попытке сжатия каталога).
  • Recursive - необязательный параметр. Если указано True, операция производится рекурсивно (с подкаталогами).
UncompressEx(string StopFileName, string StartFileName, boolean Recursive) Распаковывает папку. Параметры:
  • StopFileName - выходной параметр. Имя файла/каталога, на котором метод потерпел неудачу. Этот параметр будет содержать Null, если метод завершён успешно.
  • StartFileName - необязательный параметр. Дочерний каталог, который используется как отправная точка для распаковки. Как правило, здесь указывается путь к каталогу, на котором метод потерпел неудачу в прошлый раз (т.е. этот параметр используется при повторной попытке распаковки каталога).
  • Recursive - необязательный параметр. Если указано True, операция производится рекурсивно (с подкаталогами).

Следующий сценарий удаляет безвозвратно все папки с именем "NEW_STRU" на диске "D:".

On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
Set colFolders = objService.ExecQuery("SELECT * FROM  Win32_Directory WHERE " & _
	"FileName = 'NEW_STRU' AND Drive = 'd:'")
For Each objFolder In colFolders
	WScript.Echo objFolder.Name
	objFolder.Delete
Next

Следующий сценарий копирует папку "c:\test" со всем содержимым, создавая папку "c:\test2":

On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
Set colFolders = objService.ExecQuery("SELECT * FROM  Win32_Directory WHERE Name = 'c:\\test'")
For Each objFolder In colFolders
	objFolder.Copy "c:\test2"
Next

Класс CIM_DataFile

Класс CIM_DataFile представляет файл. Некоторые свойства класса:


СвойствоОписание
Caption
Name
Description
Краткое описание объекта. Фактически - полный путь к файлу.
FileSize Размер файла в байтах.
Path Путь к каталогу, содержащему файл, завершённый наклонной чертой. Например, "\windows\system\".
EightDotThreeFileName Полный путь с DOS-совместимым именем файла. Например, для файла "c:\windows\microsoft.net\framework\v1.1.4322\vshelpmetadata.reg" это будет "c:\windows\microsoft.net\framework\v1.1.4322\vshelp~1.reg".
Drive Буква диска с двоеточием.
FileName Имя файла без расширения.
Extension Расширение имени файла.
CreationDate Дата и время создания файла.
LastAccessed Дата и время последнего доступа.
Compressed True, если файл сжат, и False в противном случае.
Hidden Булево значение, указывающее на атрибут "скрытый".
System Булево значение, указывающее на атрибут "системный".
Writeable Булево значение, указывающее на то, что файл может быть записан.
Archive True, если файл имеет атрибут "архивный", и False в противном случае.
FileType Описание типа файла (по данным реестра) исходя из его расширения.
FSName Тип файловой системы. Например, "NTFS".
CSName Имя компьютера.

Следующий сценарий выводит список путей всех EXE-файлов из каталога "c:\windows\system32\" (подкаталоги не учитываются):

On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
Set colFiles = objService.ExecQuery("SELECT * FROM CIM_DataFile WHERE " & _
	"Drive = 'C:' AND Path = '\\windows\\system32\\' AND Extension = 'EXE'")
For Each objFile In colFiles
	WScript.Echo objFile.Name
Next
WScript.Echo "Всего файлов: " & colFiles.Count

Следующий сценарий выводит список путей всех EXE-файлов из каталога "C:\Program Files\1Cv77\" и вложенных подкаталогов. Примечание: запросы к файловой системе с ключевым словом "LIKE" (подобные запросу в этом сценарии) могут выполняться в течение довольно продолжительного времени. Указание в операторе SELECT конкретных полей вместо использования "*" позволяет несколько уменьшить время исполнения запроса:

On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
Set colFiles = objService.ExecQuery("SELECT Name FROM CIM_DataFile WHERE " & _
	"Drive = 'C:' AND Path LIKE '\\Program Files\\1Cv77\\%' AND Extension = 'EXE'")
For Each objFile In colFiles
	WScript.Echo objFile.Name
Next
WScript.Echo "Всего файлов: " & colFiles.Count

Описание некоторых методов класса CIM_DataFile:


МетодОписание
Copy(string FileName) Копирует файл к местоположению, указанному во входном параметре (указывается полный путь к файлу). Перезапись (overwriting) существующего файла не поддерживается (если файл назначения существует, никаких действий произведено не будет). Возвращает нуль в случае успеха или код ошибки.
Rename(string FileName) Переименовывает файл. Во входном параметре указывается полный путь. Перезапись (overwriting) существующего файла не поддерживается (если файл назначения существует, никаких действий произведено не будет). Возвращает нуль в случае успеха или код ошибки.
Delete() Удаляет файл. Файл НЕ попадает в корзину. Возвращает нуль в случае успеха или код ошибки.

Следующий сценарий копирует файл "c:\boot.ini" на диск "d:":

On Error Resume Next
Set objService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
	WScript.Echo Err.Number & ": " & Err.Description
	WScript.Quit
End If
Set colFiles = objService.ExecQuery("SELECT * FROM  CIM_DataFile WHERE " & _
	"Drive = 'c:' AND FileName = 'boot' AND Extension = 'ini'")
For Each objFile In colFiles
	WScript.Echo objFile.Copy("d:\boot.ini")
Next

Людоговский Александр

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.