web-dev-qa-db-fra.com

Comment puis-je obtenir la lettre de lecteur de l'ISO montée avec Mount-DiskImage

J'ai un ISO que je monte via la commande Mount-DiskImage . Cependant, je ne sais pas comment obtenir la lettre de lecteur pour l’image disque montée. J'essaie $mountResult = Mount-DiskImage D:\ISOs\clonezilla-live-1.2.12-10-i486.iso -PassThru. Aucune des informations renvoyées n'est la lettre de lecteur, comme illustré ci-dessous:

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       : 

Appeler Get-DiskImageD:\ISOs\clonezilla-live-1.2.12-10-i486.iso après ne renvoie pas non plus la lettre de lecteur.

Comment puis-je obtenir la lettre de lecteur?

23
Justin Dearing

Essaye ça:

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

Ceci retournera la lettre de lecteur à laquelle ISO est assignée avec d'autres informations - à partir de là, il ne reste plus qu'à analyser la sortie.

EDIT: Cela retournera JUST la lettre du lecteur:

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

44
isaacparrot

J'ai trouvé que ça marche

$ beforeMount = (Get-Volume) .DriveLetter

$ mountResult = Mount-DiskImage $ imagePath

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

3
James

FYI J'ai eu un problème de montage de la même image à nouveau alors j'ai fait une petite modification, qui vérifie si l'image est déjà montée sinon monte et donne le volume. 

$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)
3
akhila vangala

Je ne suis pas tout à fait sûr que cela convienne ici, mais compte tenu de la question et des réponses, je dirais que oui.

Italiques: copiés à partir de l'invite de commande.

Hypothèses

Lorsque nous parlons de montage, nous parlons généralement de montage de disques (virtuels) pour lesquels nous avons DISKPART.EXE ou de fichiers d'installation tels que .WIM et .SWM pour lesquels nous avons DISM.EXE (IMAGEX.EXE) ou de logiciels tiers. comme 'NTLite', ou concerne les images de CD et de DVD comme .ISO. Autant que je sache, les fichiers .ISO sont toujours montés en lecture seule, sauf si un logiciel tiers est utilisé. En tant que tels, les fichiers ISO sont les fichiers les plus inflexibles et c'est pourquoi j'ai écrit ceci en partant du principe que la question avait été posée à l'époque de fournir un chemin correct et complet vers le fichier source pour une ou plusieurs commandes de copie, une commande de recherche, ou une commande de lecture, chacune d’elles dépendant d’un chemin bien défini vers un fichier source, mais pas nécessairement du chemin de l’image montée. 

Une solution possible #

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

On peut soutenir que cette combinaison est la plus efficace pour répondre à la question et résoudre le problème, car POWERSHELL.EXE n’ouvre pas de "gui" (tous les commentaires "stdout" et "stderr", une fois autorisés, figureront dans un fenêtre), alors qu’elle nous délivre une 'sortie standard' qui rend inutile la nécessité d’obtenir une lettre de lecteur superflue pour votre fichier et/ou de commander une perte de temps. Si je suis correct, le 'devicepath' sera toujours le même, bien que je ne l'aie pas vérifié, et je ne peux pas dire s'il ne s'agit que de mon ordinateur.

Problème concernant l’utilisation de POWERSHELL.EXE via le COMMAND PROPMT

Un problème cependant, c’est peut-être mon ordinateur, mais il vaut mieux répéter la commande POWERSHELL.EXE, car avec moi et mes fichiers de traitement du lot la plupart du temps 'Attached: False' est le résultat du premier essai, les deux avec montage, ( false ), ainsi que le "démontage" de l'image, ( true ). Cela provoquera une erreur dans l'exécution de mon ou votre 'Fichier de traitement' qui ressemble à ceci: 'Le système ne peut pas trouver le chemin spécifié.' Cela suivra le moment où une autre commande référencera le "point de montage" et l'image prévus. 

ADDENDUM 05-fev-2017: J'ai découvert que la solution consistant à utiliser \.\CDROMX ne semble fonctionner que si l'on ajoute/256, sinon le message suivant peut échouer:

2017/02/05 01:11:15 ERREUR 53 (0x00000035) Accès au répertoire source \.\CDROM0\ Le chemin d'accès réseau n'a pas été trouvé. 

J'espère que cela aide les gens. Cela m'a déjà aidé, à la suite du réglage de la longue ligne du bloc-notes: 72 crée une mise en page moche sur stackoverflow.

1
RzzRBladez

Cela a fonctionné pour moi: 

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