31

我有一个通过Mount-DiskImage命令安装的 ISO。但是,我不知道如何获取已安装磁盘映像的驱动器号。我试试$mountResult = Mount-DiskImage D:\ISOs\clonezilla-live-1.2.12-10-i486.iso -PassThru。返回的信息都不是驱动器号,如下图所示:

PS C:\Windows\system32> $mountResult | fl *


Attached              : False
BlockSize             : 0
DevicePath            : 
FileSize              : 110100480
ImagePath             : D:\ISOs\clonezilla-live-1.2.12-10-i486.iso
LogicalSectorSize     : 2048
Number                : 
Size                  : 110100480
StorageType           : 1
PSComputerName        : 
CimClass              : ROOT/Microsoft/Windows/Storage:MSFT_DiskImage
CimInstanceProperties : {Attached, BlockSize, DevicePath, FileSize...}
CimSystemProperties   : Microsoft.Management.Infrastructure.CimSystemProperties

PS C:\Windows\system32> $mountResult | select -ExpandProperty CimSystemProperties | fl *


Namespace  : ROOT/Microsoft/Windows/Storage
ServerName : ECHO-BASE
ClassName  : MSFT_DiskImage
Path       : 

之后调用Get-DiskImage D:\ISOs\clonezilla-live-1.2.12-10-i486.iso也不返回驱动器号。

如何获取驱动器号?

4

6 回答 6

62

尝试这个:

$mountResult = Mount-DiskImage D:\ISOs\clonezilla-live-1.2.12-10-i486.iso -PassThru
$mountResult | Get-Volume

这将返回 ISO 分配给的驱动器号以及其他信息——从那里只需解析输出。

编辑:这将只返回驱动器号:

$driveLetter = ($mountResult | Get-Volume).DriveLetter

于 2013-05-09T02:01:33.010 回答
3

我发现这行得通

$beforeMount = (Get-Volume).DriveLetter

$mountResult = Mount-DiskImage $imagePath

$setuppath = (compare $beforeMount (Get-Volume).DriveLetter -PassThru) + ":\"
于 2013-12-18T22:26:14.563 回答
3

仅供参考,我再次安装相同的图像时遇到问题,所以我做了一个小改动,如果没有安装,它会检查图像是否已经安装并给出卷。

$ImagePath= " " ## Path of ISO image to be mounted 
$ISODrive = (Get-DiskImage -ImagePath $ImagePath | Get-Volume).DriveLetter
IF (!$ISODrive) {
Mount-DiskImage -ImagePath $ImagePath -StorageType ISO
}
$ISODrive = (Get-DiskImage -ImagePath $ImagePath | Get-Volume).DriveLetter
Write-Host ("ISO Drive is " + $ISODrive)
于 2016-11-15T18:57:15.320 回答
2

嗯..为什么这么复杂?

Mount-DiskImage D:\cd.iso -PassThru | Get-Volume
于 2019-04-12T07:27:05.560 回答
1

我不完全确定它是否属于这里,但考虑到问题和答案,我会说它属于。

斜体:复制自命令提示符。

假设

当我们谈论挂载时,我们通常会谈论挂载(虚拟)磁盘,我们有 DISKPART.EXE,或者像 .WIM 和 .SWM 这样的安装文件,我们有 DISM.EXE (IMAGEX.EXE),或者第三方软件像“NTLite”,或者它涉及像 .ISO 这样的 CD 和 DVD 映像。据我所知,.ISO 文件始终以只读方式安装,除非使用第三方软件。因此 .ISO 文件是最不灵活的文件,因此我写这篇文章的假设是当时提出的问题是为一个或多个复制命令、查找命令提供源文件的正确和完整路径,或读取命令,它们中的每一个都取决于源文件的明确定义路径,不一定是已安装映像的路径。

一种可能的解决方案#

c:\windows\system32>powershell.exe mount-diskimage -imagepath
"d:\blah\vlah.iso" -confirm -passthru

Attached           : True
Blocksize          : 0
Devicepath         : \\.\CDROM0 <<== Object of interest, since COPY.EXE
Filesize           : 4586569728           won't recurse and XCOPY.EXE
Imagepath          : "d:\blah\vlah.iso"   won't accept it as a valid 
Logicalsectorsize  : 2048                 path, however ROBOCOPY.EXE
Number             : 0                 will accept it and then it does 
Size               : 4586569728        do what I demand of it, copy the  
Storagetype        : 1                 contents of the  mounted .ISO
Pscomputername     :

xcopy \\.\CDROM0\*.* C:\new /h /i /c /k /e /r /y /f /b
Invalid drive specification
0 File(s) copied

Robocopy \\.\CDROM0 C:\new /E /ZB /COPYALL /256 /R:3 /W:1 /X /V /TS  
/FP /NP /ETA /LOG:w:\ROBO.LOG /TEE /NJH

可以说,这种组合对于回答问题和解决问题都是最有效的,因为 POWERSHELL.EXE 不会打开“gui”,(因此所有反馈“stdout”和“stderr”,如果允许,将出现在一个窗口),而它为我们提供了“标准输出”,这使得获取驱动器号的必要性对您的文件和/或命令来说是多余的和/或命令浪费时间。如果我是正确的,“设备路径”将始终相同,尽管我没有检查过,我不能说这是否仅在我的计算机上是这样。

关于通过命令提示符使用 POWERSHELL.EXE 的问题

虽然有一个问题,它可能是我的电脑,但最好重复 POWERSHELL.EXE 命令,因为对于我和我的批处理文件,大多数时候“附加:错误”是第一次尝试的结果,无论是安装,(),以及“卸载”图像,( true )。这将导致执行我或您的“批处理文件”时出现错误,类似于:“系统找不到指定的路径。” 这将紧随另一个命令将引用预期的“挂载点”和图像的那一刻。

附录 2017 年 2 月 5 日:我发现使用 \.\CDROMX 的解决方案似乎仅在添加 /256 时才有效,否则可能会失败并显示以下消息:

2017/02/05 01:11:15 错误 53 (0x00000035) 访问源目录 \.\CDROM0\ 找不到网络路径。

我希望这对人们有所帮助,这已经对我有所帮助,遵循记事本长线设置:72 在stackoverflow上创建了一个丑陋的布局。

于 2016-12-13T04:03:47.513 回答
0

这对我有用:

$beforeMount = (Get-Volume).DriveLetter
$imagePath = 'C:\dsc\en_windows_server_2016_x64_dvd_9718492.iso'
$mountResult = Mount-DiskImage $imagePath
$afterMount = (Get-Volume).DriveLetter
$setuppath = "$(($afterMount -join '').replace(($beforeMount -join ''), '')):\"
于 2017-05-19T14:04:48.667 回答