Как получить букву диска для 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