7

Я пробовал команды Diskpart, такие как "список", "объем" (нет, это совсем не так), "диск" и "раздел"; но это все еще не работает.

\Device\Harddiskvolume0, по-видимому, не используется, поскольку \Device\Harddiskvolume1 означает первый раздел Windows (он же "System Reserved"), а \Device\Harddiskvolume2 предназначен для C:.

Итак, вопрос: как перечислить каждый \Device \Harddiskvolume на установочном диске Windows 7 (для редактирования BCD)?

7 ответов7

3

Найден скрипт powershell, в котором перечислены подключенные тома:

# 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
       }
   }

Источник:http://www.morgantechspace.com/2014/11/Get-Volume-Path-from-Drive-Name-using-Powershell.html

Вывод выглядит так:

DevicePath               DriveLetter
----------               -----------
\Device\HarddiskVolume2  F:         
\Device\HarddiskVolume7  J:         
\Device\HarddiskVolume10 D:         
\Device\HarddiskVolume12 E:         
\Device\HarddiskVolume5  C:    
2

Причина, по которой я не смог этого сделать, заключается в том, что HarddiskVolume не отражает тома Diskpart, в котором перечислены только все читаемые тома Windows.

Фактически, он работает со всеми разделами, доступными на диске, даже не с Windows, в порядке, в котором они выглядят как в Gparted для Linux.

Например, если у вас есть sda4 до sda3, этот последний будет отображаться как -sda4, затем sda3- (HarddiskVolume4, затем HarddiskVolume3).

Таким образом, это означает, что HarddiskVolume0 в основном не существует в BCD.

Команды, которые помогли мне понять это:

mountvol /L

bootsect /nt60 all /force   ->   Be careful with that one !!!

Эти ссылки также помогли мне:

Наконец, если у вас есть запасная Windows, просто запустите DriveLetterView, чтобы увидеть, как Windows работает с HarddiskVolume.

Примечание. HarddiskVolume - это обозначение WMI/COM

2

Самым простым способом без установки чего-либо и работы со сценариями Powershell может быть System Information Viewer - переносимое приложение Windows. Это приложение прекрасно, потому что оно предоставляет почти всю информацию о вашей машине / оборудовании. Он не только предлагает считывание данных, связанных с жестким диском, но и почти все о вашем устройстве можно найти. Более того, он очень легкий, но TBH немного запутанный структурированный.

Наконец, как вы находите информацию о диске? В разделе « Тома» ▼ есть опция « Список томов» , которая предоставит вам обзор всех \Device\HarddiskvolumeXX, имеющихся на вашем компьютере. Кроме того, вы получаете букву диска и GUID ваших разделов.

Вывести список всех \Device\HarddiskVolumeXX, включая те, которые не смонтированы под любой буквой диска для каждого физического драйвера, а также номер диска (как видно в разделе « Управление дисками Windows»). Откройте раскрывающийся список « Тома» и выберите « Сопоставление дисков».

Я также хочу выделить опцию Диски, которая отображает \.\PhysicalDriveXX, путь, идентификатор устройства и контроллера. Список под Drive Mapping также может быть весьма полезным.

1

Как мне перечислить каждый Harddiskvolume в Windows?

Это можно сделать с помощью diskpart .

Решение 1:

  1. Запустите diskpart .

  2. Введите list volume чтобы получить список всех подключенных дисков

  3. Тип exit

Пример вывода:

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>

Решение 2:

  1. Запустите diskpart .

  2. Введите list disk чтобы вывести список всех подключенных дисков.

  3. Введите select disk # где # - номер диска.

  4. Тип detail disk

  5. Повторите шаги 3 и 4 для каждого диска.

  6. Тип exit

Пример вывода ниже показывает, что в настоящее время у меня есть 3 диска с 5 томами.

Пример вывода:

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>

Дальнейшее чтение

0

Более простой способ сделать это, как написано ниже. Я также настроил пару столбцов.

Пожалуйста, запустите ниже в 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

Я адаптировал ответ @ merle, используя подход, описанный в MSDN. На этом также показаны устройства без буквы диска или томов, подключенных к каталогу.

$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));
-1

Если вы хотите просто узнать, где находится ваше системное хранилище BCD, взгляните на значение \REGISTRY \MACHINE \BCD00000000 в разделе реестра HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Control \hivelist. Да, его местоположение может отличаться от \Device \HardDiskVolume1, даже если он находится на 1-м разделе 1-го физического диска.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .