Тема: VBS: программное создание *.iso образа компакт-диска посредством IMAPI
Option Explicit
' *** Enum FsiFileSystems ***
Const FsiFileSystemNone = 0
Const FsiFileSystemISO9660 = 1
Const FsiFileSystemJoliet = 2
Const FsiFileSystemUDF = 4
Const FsiFileSystemUnknown = 1073741824
' *** Enum IMAPI_MEDIA_PHYSICAL_TYPE ***
Const IMAPI_MEDIA_TYPE_UNKNOWN = 0
Const IMAPI_MEDIA_TYPE_CDROM = 1
Const IMAPI_MEDIA_TYPE_CDR = 2
Const IMAPI_MEDIA_TYPE_CDRW = 3
Const IMAPI_MEDIA_TYPE_DVDROM = 4
Const IMAPI_MEDIA_TYPE_DVDRAM = 5
Const IMAPI_MEDIA_TYPE_DVDPLUSR = 6
Const IMAPI_MEDIA_TYPE_DVDPLUSRW = 7
Const IMAPI_MEDIA_TYPE_DVDPLUSR_DUALLAYER = 8
Const IMAPI_MEDIA_TYPE_DVDDASHR = 9
Const IMAPI_MEDIA_TYPE_DVDDASHRW = 10
Const IMAPI_MEDIA_TYPE_DVDDASHR_DUALLAYER = 11
Const IMAPI_MEDIA_TYPE_DISK = 12
Const IMAPI_MEDIA_TYPE_DVDPLUSRW_DUALLAYER = 13
Const IMAPI_MEDIA_TYPE_HDDVDROM = 14
Const IMAPI_MEDIA_TYPE_HDDVDR = 15
Const IMAPI_MEDIA_TYPE_HDDVDRAM = 16
Const IMAPI_MEDIA_TYPE_BDROM = 17
Const IMAPI_MEDIA_TYPE_BDR = 18
Const IMAPI_MEDIA_TYPE_BDRE = 19
Const IMAPI_MEDIA_TYPE_MAX = 19
' *** Enum PlatformId ***
Const PlatformX86 = 0
Const PlatformPowerPC = 1
Const PlatformMac = 2
Const PlatformEFI = 239
' *** Enum EmulationType ***
Const EmulationNone = 0
Const Emulation12MFloppy = 1
Const Emulation144MFloppy = 2
Const Emulation288MFloppy = 3
Const EmulationHardDisk = 4
Const adFileTypeBinary = 1
Dim strBaseFolder
Dim strSourceFolder
Dim strISOImagePath
Dim strBootImage
Dim strISOVolumeName
Dim objBootOptions
Dim objFileSystemImageResult
Dim objStream
Dim objSFStream
Dim lngImageSize
Dim lngWrittenBytes
strBaseFolder = "C:\Мои проекты\Малый джентльменский набор"
strSourceFolder = strBaseFolder & "\Codecs"
strISOImagePath = strBaseFolder & "\Out\DBL 4.28.iso"
strBootImage = strBaseFolder & "\bcdwboot.bin"
strISOVolumeName = "DBL 4.28"
' Создаём новый образ файловой системы диска
With WScript.CreateObject("IMAPI2FS.MsftFileSystemImage")
'---------------------------------------------------------------------------
' Задаём тип файловой системы и размер образа
.ChooseImageDefaultsForMediaType IMAPI_MEDIA_TYPE_DISK
.FileSystemsToCreate = FsiFileSystemISO9660 + FsiFileSystemJoliet
'---------------------------------------------------------------------------
' Задаём имя образа
.VolumeName = strISOVolumeName
'---------------------------------------------------------------------------
' Задаём загрузчик
Set objBootOptions = WScript.CreateObject("IMAPI2FS.BootOptions")
With objBootOptions
.Manufacturer = "Microsoft"
.PlatformId = PlatformX86
.Emulation = EmulationNone
End With
' Загружаем загрузчик из файла в образ с помощью вспомогательного потока —
' объекта «ADODB.Stream»
Set objStream = CreateObject("ADODB.Stream")
With objStream
.Type = adFileTypeBinary
.Open
.LoadFromFile strBootImage
End With
objBootOptions.AssignBootImage objStream
.BootImageOptions = objBootOptions
'---------------------------------------------------------------------------
' Теперь танцуем от корневого каталога образа
With .Root
'---------------------------------------------------------------------------
' Самое простое — добавляем в корневой каталог папку со всем содержимым
.AddTree strSourceFolder, True
'---------------------------------------------------------------------------
' Почти то же самое, но добавляем в корневой каталог только содержимое папки,
' без неё самой
.AddTree strBaseFolder & "\OtherRoot", False
'---------------------------------------------------------------------------
' Просто создаём «ручками» папку в корневом каталоге образа
.AddDirectory "Files for testing"
'---------------------------------------------------------------------------
' Добавляем файл в корневой каталог
'
' Сначала получаем содержимое файла…
objStream.LoadFromFile strBaseFolder & "\autorun.inf"
' …затем добавляем его под заданным именем
.AddFile "autorun.inf", objStream
'---------------------------------------------------------------------------
' Добавляем файл в произвольную существующую(!) папку образа,
' например, в созданную выше «Files for testing»
'
' Как и ранее, сначала получаем содержимое файла…
objStream.LoadFromFile strBaseFolder & "\DBL.ico"
' …затем добавляем его под заданным именем (причём, не обязательно
' под тем же именем)
.AddFile "Files for testing\My.ico", objStream
End With
' Закрываем и очищаем вспомогательный поток
objStream.Close
Set objStream = Nothing
'---------------------------------------------------------------------------
' Создаём результирующий образ и подстыковываемся к нему объектом «newObjects.utilctls.SFStream»
' из библиотеки «newObjects ActiveX Pack1» (http://www.newobjects.com),
' дабы записать образ в виде ISO на жёсткий диск
Set objSFStream = WScript.CreateObject("newObjects.utilctls.SFStream")
objSFStream.SetStream .CreateResultImage().ImageStream
End With
' Создаём выходной файл
With WScript.CreateObject("newObjects.utilctls.SFMain").CreateFile(strISOImagePath)
' Получаем размер образа
lngImageSize = objSFStream.Size
' Пишем образ на жёсткий диск и получаем количество записанных байт
lngWrittenBytes = .WriteBin(objSFStream.ReadBin(lngImageSize))
' Закрываем созданный поток
.Close
End With
Set objSFStream = Nothing
Set objBootOptions = Nothing
WScript.Echo "ISO image name:", strISOVolumeName
WScript.Echo "ISO file path :", strISOImagePath
WScript.Echo "ISO image size:", FormatNumber(lngImageSize, 0), "b"
WScript.Echo "Written bytes :", FormatNumber(lngWrittenBytes, 0), "b"
WScript.Quit 0
Примерный результат:
ISO image name: DBL 4.28 ISO file path : C:\Мои проекты\Малый джентльменский набор\Out\DBL 4.28.iso ISO image size: 65,327,104 b Written bytes : 65,327,104 b
Отдельное спасибо BeS Yara.
Ссылки:
* источники: Creating ISO files with vbscript possible??? и Writing an ISO image to disc;
* IMAPI SDK: Image Mastering API (Windows) и примеры сценариев: Using IMAPI (Windows);
* библиотека newObjects ActiveX Pack1 (AXPack1).