J'ai essayé des commandes Diskpart comme "list" "volume" (non, ce n'est pas du tout ça), "disque" et "partition"; mais ça ne marche toujours pas.
\ Device\Harddiskvolume0 ne semble pas être utilisé, car\Device\Harddiskvolume1 signifie la première partition de Windows ("Système réservé") et\Device\Harddiskvolume2 est destiné à C :.
La question est donc la suivante: comment répertorier chaque\Device\Harddiskvolume dans le disque d’installation de Windows 7 (pour l’édition BCD)?
La raison pour laquelle je ne pouvais pas faire avancer les choses est que HarddiskVolume ne reflète pas les volumes Diskpart - qui ne répertorie que tous les volumes lisibles par Windows -.
En fait, cela fonctionne avec toutes les partitions disponibles sur le disque (même celles qui ne sont pas Windows), par ordre d'affichage, comme dans Gparted de Linux.
Par exemple, si vous avez un fichier sda4 avant sda3, ce dernier s'affichera tel quel -sda4 puis sda3- (HarddiskVolume4 puis HarddiskVolume3).
Cela signifie donc que HarddiskVolume0 n'existe pas principalement dans BCD.
Les commandes qui m'ont aidé à comprendre qui sont:
mountvol /L
bootsect /nt60 all /force -> Be careful with that one !!!
Ces liens m'ont aussi aidé:
Enfin, si vous avez un Windows libre, exécutez simplement DriveLetterView pour voir comment Windows fonctionne avec HarddiskVolume.
Remarque: le HarddiskVolume est une notation WMI/COM.
Trouvé un script PowerShell qui répertorie les volumes montés:
# Biuild System Assembly in order to call Kernel32:QueryDosDevice.
$DynAssembly = New-Object System.Reflection.AssemblyName('SysUtils')
$AssemblyBuilder = [AppDomain]::CurrentDomain.DefineDynamicAssembly($DynAssembly, [Reflection.Emit.AssemblyBuilderAccess]::Run)
$ModuleBuilder = $AssemblyBuilder.DefineDynamicModule('SysUtils', $False)
# Define [Kernel32]::QueryDosDevice method
$TypeBuilder = $ModuleBuilder.DefineType('Kernel32', 'Public, Class')
$PInvokeMethod = $TypeBuilder.DefinePInvokeMethod('QueryDosDevice', 'kernel32.dll', ([Reflection.MethodAttributes]::Public -bor [Reflection.MethodAttributes]::Static), [Reflection.CallingConventions]::Standard, [UInt32], [Type[]]@([String], [Text.StringBuilder], [UInt32]), [Runtime.InteropServices.CallingConvention]::Winapi, [Runtime.InteropServices.CharSet]::Auto)
$DllImportConstructor = [Runtime.InteropServices.DllImportAttribute].GetConstructor(@([String]))
$SetLastError = [Runtime.InteropServices.DllImportAttribute].GetField('SetLastError')
$SetLastErrorCustomAttribute = New-Object Reflection.Emit.CustomAttributeBuilder($DllImportConstructor, @('kernel32.dll'), [Reflection.FieldInfo[]]@($SetLastError), @($true))
$PInvokeMethod.SetCustomAttribute($SetLastErrorCustomAttribute)
$Kernel32 = $TypeBuilder.CreateType()
$Max = 65536
$StringBuilder = New-Object System.Text.StringBuilder($Max)
Get-WmiObject Win32_Volume | ? { $_.DriveLetter } | % {
$ReturnLength = $Kernel32::QueryDosDevice($_.DriveLetter, $StringBuilder, $Max)
if ($ReturnLength)
{
$DriveMapping = @{
DriveLetter = $_.DriveLetter
DevicePath = $StringBuilder.ToString()
}
New-Object PSObject -Property $DriveMapping
}
}
Source: http://www.morgantechspace.com/2014/11/Get-Volume-Path-from-Drive-Name-using-Powershell.html
La sortie ressemble à ceci:
DevicePath DriveLetter
---------- -----------
\Device\HarddiskVolume2 F:
\Device\HarddiskVolume7 J:
\Device\HarddiskVolume10 D:
\Device\HarddiskVolume12 E:
\Device\HarddiskVolume5 C:
Cela peut être fait en utilisant diskpart
.
Solution 1:
Exécutez diskpart
.
Tapez list volume
pour répertorier tous les volumes de disque attachés.
Tapez exit
Exemple de sortie:
F:\test>diskpart
Microsoft DiskPart version 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
On computer: HAL
DISKPART> list volume
Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 0 D DVD-ROM 0 B No Media
Volume 1 System Rese NTFS Partition 100 MB Healthy System
Volume 2 C NTFS Partition 449 GB Healthy Boot
Volume 3 Recovery NTFS Partition 16 GB Healthy Hidden
Volume 4 E SANDISK FAT32 Removable 59 GB Healthy
Volume 5 F Expansion NTFS Partition 2794 GB Healthy
DISKPART> exit
Leaving DiskPart...
F:\test>
Solution 2:
Exécutez diskpart
.
Tapez list disk
pour répertorier tous les disques connectés.
Tapez select disk #
où #
est le numéro du disque.
Tapez detail disk
Répétez les étapes 3 et 4 pour chaque disque.
Tapez exit
L'exemple de sortie ci-dessous montre que j'ai actuellement 3 disques avec 5 volumes.
Exemple de sortie:
F:\test>diskpart
Microsoft DiskPart version 6.1.7601
Copyright (C) 1999-2008 Microsoft Corporation.
On computer: HAL
DISKPART> list disk
Disk ### Status Size Free Dyn Gpt
-------- ------------- ------- ------- --- ---
Disk 0 Online 465 GB 0 B
Disk 1 Online 59 GB 0 B
Disk 2 Online 2794 GB 7168 KB
DISKPART> select disk 0
Disk 0 is now the selected disk.
DISKPART> detail disk
WDC WD5000LPVX-08V0TT5
Disk ID: D831FAA5
Type : ATA
Status : Online
Path : 0
Target : 0
LUN ID : 0
Location Path : PCIROOT(0)#ATA(C00T00L00)
Current Read-only State : No
Read-only : No
Boot Disk : Yes
Pagefile Disk : Yes
Hibernation File Disk : No
Crashdump Disk : Yes
Clustered Disk : No
Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 1 System Rese NTFS Partition 100 MB Healthy System
Volume 2 C NTFS Partition 449 GB Healthy Boot
Volume 3 Recovery NTFS Partition 16 GB Healthy Hidden
DISKPART> select disk 1
Disk 1 is now the selected disk.
DISKPART> detail disk
SanDisk Cruzer USB Device
Disk ID: 00000000
Type : USB
Status : Online
Path : 0
Target : 0
LUN ID : 0
Location Path : UNAVAILABLE
Current Read-only State : No
Read-only : No
Boot Disk : No
Pagefile Disk : No
Hibernation File Disk : No
Crashdump Disk : No
Clustered Disk : No
Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 4 E SANDISK FAT32 Removable 59 GB Healthy
DISKPART> select disk 2
Disk 2 is now the selected disk.
DISKPART> detail disk
Seagate Expansion Desk USB Device
Disk ID: 75447009
Type : USB
Status : Online
Path : 0
Target : 0
LUN ID : 0
Location Path : UNAVAILABLE
Current Read-only State : No
Read-only : No
Boot Disk : No
Pagefile Disk : No
Hibernation File Disk : No
Crashdump Disk : No
Clustered Disk : No
Volume ### Ltr Label Fs Type Size Status Info
---------- --- ----------- ----- ---------- ------- --------- --------
Volume 5 F Expansion NTFS Partition 2794 GB Healthy
DISKPART> exit
Leaving DiskPart...
F:\test>
Le moyen le plus simple de ne rien installer et de bricoler avec les scripts Powershell pourrait être la visionneuse d'informations système , une application Windows portable. Cette application est géniale car elle fournit presque toutes les informations sur votre machine/matériel. Il offre non seulement une lecture des données relatives au disque dur, mais presque tout ce qui concerne votre appareil peut être trouvé. De plus, il est très léger mais TBH structuré un peu déroutant.
Enfin, comment trouvez-vous les informations de lecteur? Sous Volumes ▼ , vous avez l'option Liste de volumes qui vous donnera un aperçu de tous \Device\HarddiskvolumeXX. présent sur votre ordinateur. De plus, vous obtenez une lettre de lecteur et GUID de vos partitions.
Pour répertorier tous \Device\HarddiskVolumeXX , y compris ceux qui ne sont montés sous aucune lettre de lecteur par pilote physique, ainsi que le numéro de disque (comme dans Windows Gestion des disques ). Ouvrez le menu déroulant Volumes ▼ et choisissez Mappage de disque .
Je souhaite également mettre en surbrillance l'option Lecteurs qui affiche \.\PhysicalDriveXX , les identificateurs de chemin, d'unité et de contrôleur. La liste sous Drive Mapping peut également être très utile.
Un moyen plus facile de le faire est comme écrit ci-dessous. J'ai également personnalisé quelques colonnes.
Veuillez exécuter ce qui suit dans PowerShell:
Get-CimInstance win32_volume -ComputerName "Enter Your Computer Name, or Multiple Computer Names" | select @{n="ComputerName";e={$_.PSComputerName}},DriveLetter,@{n="Capacity(GB)";e={$_.Capacity / 1gb -as [int]}},@{n="Free(GB)";e={$_.FreeSpace / 1gb -as [int]}} | ft -AutoSize
J'ai adapté la réponse de @ merle en utilisant l'approche documentée sur MSDN . Celui-ci affiche également les périphériques sans lettre de lecteur ou les volumes montés dans un répertoire.
$signature = @'
[DllImport("kernel32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetVolumePathNamesForVolumeNameW([MarshalAs(UnmanagedType.LPWStr)] string lpszVolumeName,
[MarshalAs(UnmanagedType.LPWStr)] [Out] StringBuilder lpszVolumeNamePaths, uint cchBuferLength,
ref UInt32 lpcchReturnLength);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern IntPtr FindFirstVolume([Out] StringBuilder lpszVolumeName,
uint cchBufferLength);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool FindNextVolume(IntPtr hFindVolume, [Out] StringBuilder lpszVolumeName, uint cchBufferLength);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern uint QueryDosDevice(string lpDeviceName, StringBuilder lpTargetPath, int ucchMax);
'@;
Add-Type -MemberDefinition $signature -Name Win32Utils -Namespace PInvoke -Using PInvoke,System.Text;
[UInt32] $lpcchReturnLength = 0;
[UInt32] $Max = 65535
$sbVolumeName = New-Object System.Text.StringBuilder($Max, $Max)
$sbPathName = New-Object System.Text.StringBuilder($Max, $Max)
$sbMountPoint = New-Object System.Text.StringBuilder($Max, $Max)
[IntPtr] $volumeHandle = [PInvoke.Win32Utils]::FindFirstVolume($sbVolumeName, $Max)
do {
$volume = $sbVolumeName.toString()
$unused = [PInvoke.Win32Utils]::GetVolumePathNamesForVolumeNameW($volume, $sbMountPoint, $Max, [Ref] $lpcchReturnLength);
$ReturnLength = [PInvoke.Win32Utils]::QueryDosDevice($volume.Substring(4, $volume.Length - 1 - 4), $sbPathName, [UInt32] $Max);
if ($ReturnLength) {
$DriveMapping = @{
DriveLetter = $sbMountPoint.toString()
VolumeName = $volume
DevicePath = $sbPathName.ToString()
}
Write-Output (New-Object PSObject -Property $DriveMapping)
}
else {
Write-Output "No mountpoint found for: " + $volume
}
} while ([PInvoke.Win32Utils]::FindNextVolume([IntPtr] $volumeHandle, $sbVolumeName, $Max));