Create ISO using Powershell

by | Jun 17, 2024 | IT Tips | 0 comments

Usage

1
2
3
4
New-IsoFile -NewIsoFilePath C:\tmp\Hyper-V.iso-sources -ImageName Hyper-V -SourceFilePath 'C:\tmp\Hyper-V'
 
New-IsoFile -NewIsoFilePath C:\tmp\W2K3SP2CD1.iso -ImageName W2K3SP2CD1 -SourceFilePath 'C:\tmp\Windows 2003 Server R2 Std Edition SP2 CD1'
New-IsoFile -NewIsoFilePath C:\tmp\W2K3SP2CD2.iso -ImageName W2K3SP2CD2 -SourceFilePath 'C:\tmp\Windows 2003 Server R2 Std Edition SP2 CD2'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
function New-IsoFile
{
  param
  (
    # path to local folder to store in
    # new ISO file (must exist)
    [Parameter(Mandatory)]
    [String]
    $SourceFilePath,
 
    # name of new ISO image (arbitrary,
    # turns later into drive label)
    [String]
    $ImageName = 'MyCDROM',
 
    # path to ISO file to be created
    [Parameter(Mandatory)]
    [String]
    $NewIsoFilePath,
 
    # if specified, the source base folder is
    # included into the image file
    [switch]
    $IncludeRoot
  )
     
  # use this COM object to create the ISO file:
  $fsi = New-Object -ComObject IMAPI2FS.MsftFileSystemImage
 
  # use this helper object to write a COM stream to a file:
  # compile the helper code using these parameters:
  $cp = [CodeDom.Compiler.CompilerParameters]::new()
  $cp.CompilerOptions = '/unsafe'
  $cp.WarningLevel = 4
  $cp.TreatWarningsAsErrors = $true
  $code = '
    using System;
    using System.IO;
    using System.Runtime.InteropServices.ComTypes;
 
    namespace CustomConverter
    {
     public static class Helper
     {
      // writes a stream that came from COM to a filesystem file
      public static void WriteStreamToFile(object stream, string filePath)
      {
       // open output stream to new file
       IStream inputStream = stream as IStream;
       FileStream outputFileStream = File.OpenWrite(filePath);
       int bytesRead = 0;
       byte[] data;
 
       // read stream in chunks of 2048 bytes and write to filesystem stream:
       do
       {
        data = Read(inputStream, 2048, out bytesRead); 
        outputFileStream.Write(data, 0, bytesRead);
       } while (bytesRead == 2048);
 
       outputFileStream.Flush();
       outputFileStream.Close();
      }
 
      // read bytes from stream:
      unsafe static private byte[] Read(IStream stream, int byteCount, out int readCount)
      {
       // create a new buffer to hold the read bytes:
       byte[] buffer = new byte[byteCount];
       // provide a pointer to the location where the actually read bytes are reported:
       int bytesRead = 0;
       int* ptr = &bytesRead;
       // do the read:
       stream.Read(buffer, byteCount, (IntPtr)ptr);  
       // return the read bytes by reference to the caller:
       readCount = bytesRead;
       // return the read bytes to the caller:
       return buffer;
      }
     }
  }'
 
  Add-Type -CompilerParameters $cp -TypeDefinition $code
 
  # define the ISO file properties:
 
  # create CDROM, Joliet and UDF file systems
  $fsi.FileSystemsToCreate = 7
  $fsi.VolumeName = $ImageName
  # allow larger-than-CRRom-Sizes
  $fsi.FreeMediaBlocks = -1   
 
  $msg = 'Creating ISO File - this can take a couple of minutes.'
  Write-Host $msg -ForegroundColor Green
     
  # define folder structure to be written to image:
  $fsi.Root.AddTreeWithNamedStreams($SourceFilePath,$IncludeRoot.IsPresent)
         
  # create image and provide a stream to read it:
  $resultimage = $fsi.CreateResultImage()
  $resultStream = $resultimage.ImageStream
 
  # write stream to file
  [CustomConverter.Helper]::WriteStreamToFile($resultStream, $NewIsoFilePath)
 
  Write-Host 'DONE.' -ForegroundColor Green
 
}

0 Comments

Submit a Comment

Your email address will not be published. Required fields are marked *

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

The reCAPTCHA verification period has expired. Please reload the page.