1

Тема: 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).