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?
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
J'ai trouvé que ça marche
$ beforeMount = (Get-Volume) .DriveLetter
$ mountResult = Mount-DiskImage $ imagePath
$ setuppath = (comparez $ beforeMount (Get-Volume) .DriveLetter -PassThru) + ": \"
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)
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.
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.
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.
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.
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 ''), '')):\"