Как получить букву диска для ISO I, смонтированного с помощью Mount-DiskImage

У меня есть ISO я mount с помощью команды Mount-DiskImage. Однако я не знаю, как получить букву диска для смонтированного образа диска. Я пробую $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 после того, как он не вернет букву диска.

Как получить букву диска?

Ответы

Ответ 1

Попробуйте следующее:

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

Это вернет букву диска, которой присвоен ISO, наряду с другой информацией - оттуда это просто вопрос разбора вывода.

EDIT: Это вернет JUST букву диска:   

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

Ответ 2

Я нашел это на работу

$beforeMount = (Get-Volume).DriveLetter

$mountResult = Mount-DiskImage $imagePath

$setuppath = (compare $beforeMount (Get-Volume).DriveLetter -PassThru) + ":\"

Ответ 3

FYI У меня возникла проблема с тем же изображением, поэтому я сделал небольшое изменение, которое проверяет, смонтирован ли образ, если он не монтируется и не дает тома.

$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)

Ответ 4

Я не совсем уверен, принадлежит ли он здесь, но, учитывая вопрос и ответы, которые я бы сказал.

Курсив: скопирован из COMMAND PROMPT.

Предположения

Когда мы говорим о монтаже, мы обычно говорим о монтажных (виртуальных) дисках, для которых у нас есть DISKPART.EXE или файлы установки, такие как .WIM и .SWM, для которых у нас есть DISM.EXE(IMAGEX.EXE) или стороннего программного обеспечения, такого как "NTLite", или это касается образов CD и DVD, таких как .ISO. Насколько я знаю .ISO файлы всегда монтируются только для чтения, если не используется стороннее программное обеспечение. Поскольку такие .ISO файлы являются самыми негибкими файлами, и, таким образом, я написал это из предположения, что в этот вопрос был задан вопрос о том, чтобы предоставить правильный и полный путь к исходному файлу для одной или нескольких команд копирования, команду find, или команды чтения, каждая из которых зависит от четко определенного пути к исходному файлу, не обязательно путь к смонтированному изображению.

Одно возможное решение #

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", когда это разрешено, будет появляются в одном окне), в то время как он доставляет нам "stdout", что делает необходимость получения буквы диска, лишней для вашего файла, и/или пустая трата времени. Если я прав, "путь к устройству" всегда будет одним и тем же, хотя я его не проверял, и я не могу сказать, что это только на моем компьютере.

Проблема, связанная с использованием POWERSHELL.EXE через COMMAND PROPMT

Одна проблема, это может быть мой компьютер, но лучше повторить команду POWERSHELL.EXE, потому что со мной и моими партийными файлами большую часть времени "Attached: False" является результатом первой попытки, как с монтированием, (false), а также "размонтировать" изображение (true). Это вызовет ошибку при выполнении моего или вашего "Batch файла", который выглядит примерно так: "Система не может найти указанный путь". Это произойдет после того, как другая команда будет ссылаться на предполагаемую "точку монтирования" и изображение.

ADDENDUM 05-feb-2017: Я выяснил, что решение с использованием \.\CDROMX работает только при добавлении /256, иначе оно может завершиться неудачей со следующим сообщением:

2017/02/05 01:11:15 ОШИБКА 53 (0x00000035) Доступ к исходному каталогу \.\CDROM0 \ Сетевой путь не найден.

Я надеюсь, что это поможет людям, это помогло мне уже после установки длинной строки в блокноте: 72 создает уродливый макет для stackoverflow.

Ответ 5

Это сработало для меня:

$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 ''), '')):\"

Ответ 6

хм.. почему так сложно?

Mount-DiskImage D:\cd.iso -PassThru | Get-Volume