web-dev-qa-db-fra.com

Répertorie chaque \ Device \ Harddiskvolume.?

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

7
X.LINK

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.

2
X.LINK

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:    
3
merle

Comment lister chaque disque dur sous Windows?

Cela peut être fait en utilisant diskpart.

Solution 1:

  1. Exécutez diskpart.

  2. Tapez list volume pour répertorier tous les volumes de disque attachés.

  3. 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:

  1. Exécutez diskpart.

  2. Tapez list disk pour répertorier tous les disques connectés.

  3. Tapez select disk ## est le numéro du disque.

  4. Tapez detail disk

  5. Répétez les étapes 3 et 4 pour chaque disque.

  6. 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>

Lectures complémentaires

2
DavidPostill

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.

2
thex

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
0
James Adair

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));
0
phant0m