列出每个\Device\Harddiskvolume。?

X.L*_*INK 14 windows diskpart bcd

我尝试过 Diskpart 命令,如“列表”“卷”(不,根本不是那样)、“磁盘”和“分区”;但它仍然不起作用。

\Device\Harddiskvolume0 似乎没有被使用,因为 \Device\Harddiskvolume1 表示第一个 Windows 分区(又名“系统保留”),而 \Device\Harddiskvolume2 用于 C:。

所以问题是:如何列出 Windows 7 安装盘中的每个 \Device\Harddiskvolume(用于 BCD 编辑)?

pha*_*t0m 11

我使用MSDN 上记录的方法改编了@merle 的答案。

它显示驱动器:

  • 没有驱动器号
  • 挂载到文件夹
  • 带驱动器号

示例输出:

DriveLetter                    DevicePath               VolumeName                                       
-----------                    ----------               ----------                                       
                               \Device\HarddiskVolume5  \\?\Volume{a2b4c6d8-0000-0000-00000100000000000}\
E:\                            \Device\HarddiskVolume9  \\?\Volume{a2b4c6d8-1234-1234-1234-123456789abc}\
C:\Mounted\My-Folder-Mount\    \Device\HarddiskVolume13 \\?\Volume{a2b4c6d8-1234-1234-1234-123456789abc}\
Run Code Online (Sandbox Code Playgroud)

PowerShell 脚本:

$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));
Run Code Online (Sandbox Code Playgroud)

  • 好的!要添加的其他一些有用的输出可能是 FileSystemLabel(又名 FriendlyName)、大小,可能还有相应的磁盘和分区编号。为了我的一次性目的,我只是将这两行添加到脚本的末尾,这样我就可以手动匹配 Volume GUID。`获取卷| 选择 DriveLetter、FileSystemLabel、FileSystemType、Size、Path | Format-Table -Autosize` 和一个新行`Get-Partition | 选择磁盘编号、分区编号、访问路径、大小 | Sort-Object -Property DiskNumber, PartitionNumber | Format-Table -Autosize` (2认同)

小智 9

找到一个列出已安装卷的 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
       }
   }
Run Code Online (Sandbox Code Playgroud)

来源: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:    
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这并没有列出未安装在驱动器号下的卷。 (2认同)

X.L*_*INK 5

我无法完成任务的原因是 HarddiskVolume 不反映 Diskpart 卷(仅列出每个 Windows 可读卷)。

事实上,它适用于磁盘上的每个可用分区 - 甚至是非 Windows 分区 - 按照它们出现的顺序,就像 Linux 的 Gparted 中一样。

例如,如果 sda3 之前有 sda4,则后者将按原样显示 -sda4,然后 sda3-(HarddiskVolume4,然后 HarddiskVolume3)。

所以,这意味着HarddiskVolume0主要不存在于BCD中。

帮助我理解的命令是:

mountvol /L

bootsect /nt60 all /force   ->   Be careful with that one !!!
Run Code Online (Sandbox Code Playgroud)

这些链接也对我有帮助:

最后,如果您有空闲的 Windows,只需运行DriveLetterView即可查看 Windows 如何与 HarddiskVolume 配合使用。

注意:HarddiskVolume 是 WMI/COM 表示法


the*_*hex 5

不安装任何东西并修改 Powershell 脚本的最简单方法可能是System Information Viewer一个便携式 Windows 应用程序。这个应用程序很棒,因为它几乎提供了有关您的机器/硬件的所有信息。它不仅可以读取与硬盘驱动器相关的数据,而且几乎可以找到有关您设备的所有信息。此外,它非常轻巧,但 TBH 的结构有点混乱。

最后,你如何找到驱动信息?在体积下?有一个选项卷列表,它将为您提供计算机上存在的所有\Device\HarddiskvolumeXX的概览。此外,您可以获得分区的驱动器号和 GUID。

列出所有\Device\HarddiskVolumeXX包括那些未安装在每个物理驱动程序的任何驱动器号下的那些以及磁盘编号(如在 Windows磁盘管理中看到的)。打开卷?下拉菜单并选择Disk Mapping

我还想突出显示显示\.\PhysicalDriveXX、路径、单元和控制器 ID的选项DrivesDrive Mapping下的列表也可能非常有用。