Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#或PowerShell中完成CD或DVD是否有一种相对简单的方法?_C#_Powershell_Imapi - Fatal编程技术网

在C#或PowerShell中完成CD或DVD是否有一种相对简单的方法?

在C#或PowerShell中完成CD或DVD是否有一种相对简单的方法?,c#,powershell,imapi,C#,Powershell,Imapi,首先,一些术语的澄清。通过完成,我不是指结束一个会话;我的意思是在CD或DVD上写一条线索,这样信息就不能再通过通常的方式(Roxio、Nero、Windows Explorer等)添加到CD或DVD上了 我对此做了大量的研究。有一些开源程序,我们可以从中汲取灵感,但是它们似乎都包含了使用IMAPI的相当复杂的C++代码,这似乎是一种非常低级的方式。我们团队中的开发者没有一个C++或IMAPI专门知识来支持这样的代码库。 互联网上最有希望的资源似乎是,但它似乎没有包括最终确定功能。下面是“写入图

首先,一些术语的澄清。通过完成,我不是指结束一个会话;我的意思是在CD或DVD上写一条线索,这样信息就不能再通过通常的方式(Roxio、Nero、Windows Explorer等)添加到CD或DVD上了

我对此做了大量的研究。有一些开源程序,我们可以从中汲取灵感,但是它们似乎都包含了使用IMAPI的相当复杂的C++代码,这似乎是一种非常低级的方式。我们团队中的开发者没有一个C++或IMAPI专门知识来支持这样的代码库。 互联网上最有希望的资源似乎是,但它似乎没有包括最终确定功能。下面是“写入图像”的代码:

代码的关键部分似乎是:

discFormatData = new MsftDiscFormat2Data
{
    Recorder = recorder,
    ClientName = ClientName,
    ForceMediaToBeClosed = finalize // <-- Here
};
discFormatData=新的MsftDiscFormat2Data
{
记录器=记录器,
ClientName=ClientName,

ForceMediaToBeClosed=finalize/在
IMAPI2.MsftDiscFormat2Data
对象上设置
ForceMediaToBeClosed
标志,并在启用关闭标志的情况下写出光盘

  • 如果您已经知道它是您的最后一个会话,请设置标志,添加要写入的数据,然后将其写入,然后它将关闭
  • 如果您已经编写了最后一个会话,请导入最后一个会话,设置标志并将写入操作关闭
方法如下所述:

下面是一个不错的Powershell刻录脚本的链接,您只需使用新的
参数更新
输出CD
,即可在准备结束写入时设置
$DiscFormatData.ForceMediaToBeClosed=true

链接:

供参考:


下次写入后,
IDiscFormat2Data
ForceMediaToBeClosed
属性:

设置为VARIANT_TRUE可将光盘标记为已关闭,以在下一次写入会话结束时禁止额外写入

映像主控API不提供专门用于完成光盘的抽象,因此我们需要执行写入操作。如果我们使用主映像编写器打开
ForceMediaToBeClosed
,API将在初始刻录期间完成空白光盘。对于现有的多会话光盘,我们需要附加另一个会话

下面是一个简单的PowerShell示例,我们可以尝试一下,这样就不需要构建项目了

$drives=新对象-ComObject'IMAPI2.MsftDiscMaster2'
$recorder=新对象-com对象'IMAPI2.MsftDiscRecorder2'
$recorder.InitializeDiscRecorder($drives[0])#在此处选择一个驱动器
$disc=新对象-ComObject“IMAPI2.MsftDiscFormat2Data”
$disc.ClientName='PowerShell记录器'
$disc.Recorder=$Recorder
$disc.ForceMediaToBeClosed=$true#完成下一个会话
$image=新对象-com对象'IMAPI2FS.MsftFileSystemImage'
如果(!$disc.IsCurrentMediaSupported($recorder)){
抛出“光盘不可写。”
}elseif($disc.mediahueristicallyblank){
$image.选择图像默认值($recorder)
}否则{
$image.MultisessionInterfaces=$disc.MultisessionInterfaces
$image.ImportFileSystem()>$null
}
这设置了一些样板文件,我们将在下面使用这些样板文件刻录光盘。我们需要添加错误处理和功能检测以供实际使用,但作为演示,它可以很好地工作。如果我们将此代码粘贴或点源代码到PowerShell会话中,我们可以交互地播放COM对象

此时,如果我们检查空白或打开光盘的状态,我们将看到一个值
2
4
6
,对应于上枚举的“空白”或“可追加”位掩码(
6

然后,我们可以添加一些文件。如果我们只想关闭一个多会话光盘,我们不需要向映像中添加任何内容。API记录会话的引入和引出,并带有一个空数据磁道

PS> $image.Root.AddTree('path\to\root\folder', $false)
最后,我们将刻录对光盘所做的更改。由于我们将
$disc.ForceMediaToBeClosed
设置为
$true
,此操作将完成光盘,不允许进行进一步的写入操作:

PS> $disc.Write($image.CreateResultImage().ImageStream)
如果我们现在检查光盘状态,则应表明光盘不可写:

PS> $disc.CurrentMediaStatus  # 16384 or 40960
对于单会话光盘,我们应该看到
16384
0x4000
,“已定稿”)。对于包含位
0x2000
(“写保护”)和
0x8000
(“不支持的介质”)的闭合多会话光盘,我的系统报告
40960
.我们可能需要弹出或关闭某些硬件,以便在燃烧后查看准确的数值

备注:

  • 一般来说,多会话光盘上的每个会话都以一个引入端开始,以一个引出端结束。最后一个会话的引入端永久关闭介质,以便在我们完成光盘时进行进一步写入。这就是为什么即使我们没有更多的数据要添加,我们也需要在未关闭的光盘上附加一个会话的原因

  • 如果可用空间低于2%,IMAPI将自动完成光盘定稿

  • InfraRecorder问题中提到的工具不使用IMAPI。此应用程序提供了一个直接控制设备IO的前端。如果我们只需要完成未关闭的光盘,我们可能希望使用此软件包中包含的CLI程序,以避免维护额外的代码库:

    PS> cdrecord -scanbus          # Show <drive> IDs to choose from
    PS> cdrecord -fix dev=<drive>  # Close an open session
    
    PS>cdrecord-scanbus#显示可供选择的ID
    PS>cdrecord-fix dev=#关闭打开的会话
    
    作为一个简单的起点,以下是我们如何完成多会话光盘:

    PS> $session = cdrecord -msinfo dev=<drive>
    PS> mkisofs -rJ -C $session -M <drive> 'path\to\root' | cdrecord dev=<drive> -
    
    PS>$session=cdrecord-msinfo-dev=
    PS>mkisofs-rJ-C$session-M'path\to\root'| cdrecord dev=-
    
    这实现了与使用IMAPI的PowerShell脚本相同的结果:我们导入上一个会话,创建映像,然后刻录一个新会话以完成光盘。通过省略cdrecord的
    -multi
    参数,
    PS> $disc.CurrentMediaStatus  # 16384 or 40960
    
    PS> cdrecord -scanbus          # Show <drive> IDs to choose from
    PS> cdrecord -fix dev=<drive>  # Close an open session
    
    PS> $session = cdrecord -msinfo dev=<drive>
    PS> mkisofs -rJ -C $session -M <drive> 'path\to\root' | cdrecord dev=<drive> -