PowerShell – graver un CD/DVD de donnée

Bonjour à tous,

Pour des besoins non-professionnels, j’ai dû trouver une fonction permettant de graver un CD/DVD de donnée (data ou MP3 par exemple), via PowerShell.
Le but était d’inclure cette fonction dans un programme créé par Sapien PowerShell Studio 2014.

Voici donc la fonction que j’ai trouvée et éditée. Pour l’utiliser, rien de plus simple : il suffit de l’invoquer en spécifiant le chemin des fichiers à graver.

Par exemple : Burn-Disk c:\cdtemp
Cette commande aura pour résultat de trouver un graveur disponible, et de lui faire graver un disque de donnée contenant les fichiers du répertoire c:\cdtemp (pas le répertoire en lui-même).
A la fin de la gravure, le média est automatiquement éjecté.

J’espère que cela vous sera utile.

function Burn-Disk
{
	<# 
		 .SYNOPSIS 
			This function allow you to burn data CD/DVD
		.DESCRIPTION
			This function allow you to burn data CD/DVD
		.PARAMETER  Path 
			Specify the folder/files to burn on the disk
		.EXAMPLE 
			Burn-Disk c:\cdtemp
		.Notes 
			Author : Antoine DELRUE 
			WebSite: https://obilan.be 
	 #> 

    [CmdletBinding()]
 
    param (
        $Path
    )
 
    BEGIN
    {
        try
        {
            Write-Verbose 'Creating COM Objects.'
 
            $DiskMaster      = New-Object -com IMAPI2.MsftDiscMaster2
            $DiscRecorder    = New-Object -com IMAPI2.MsftDiscRecorder2
            $FileSystemImage = New-Object -com IMAPI2FS.MsftFileSystemImage
            $DiscFormatData  = New-Object -com IMAPI2.MsftDiscFormat2Data
        }
        catch
        {
            $err = $Error[0]
            Write-Error $err
            return
        }
    }
 
    PROCESS
    {
        Write-Verbose 'Initializing Disc Recorder.'
        $id = $DiskMaster.Item(0)
        $DiscRecorder.InitializeDiscRecorder($id)
 
        Write-Verbose 'Assigning recorder.'
        $dir = $FileSystemImage.Root
        $DiscFormatData.Recorder = $DiscRecorder
        $DiscFormatData.ClientName = 'PowerShell Burner'
 
        Write-Verbose 'Multisession?'
        if (-not $DiscFormatData.MediaHeuristicallyBlank)
        {
            try
            {
                $FileSystemImage.MultisessionInterfaces = $DiscFormatData.MultisessionInterfaces
                Write-Verbose 'Importing existing session.'
 
                $FileSystemImage.ImportFileSystem() | Out-Null
            }
            catch
            {
                $err = $Error[0]
                Write-Error $err
                return
            }
        }
        else
        {
            Write-Verbose 'Empty medium.'
            $FileSystemImage.ChooseImageDefaults($DiscRecorder)
        }
 
        Write-Verbose "Adding directory tree ($Path)."
        $dir.AddTree($Path, $false)
 
        Write-Verbose 'Creating image.'
        $result = $FileSystemImage.CreateResultImage()
        $stream = $result.ImageStream
 
        Write-Verbose 'Burning.'
        $DiscFormatData.Write($stream)
 
        Write-Verbose 'Done.'
		$DiscRecorder.EjectMedia()
    }
 
    END { }
}