私は「リスト」「ボリューム」(まったくそうではない)、「ディスク」、「パーティション」などのDiskpartコマンドを試しました。しかし、それでも機能しません。
\ Device\Harddiskvolume0は使用されていないようです。\ Device\Harddiskvolume1は最初のWindowsのパーティション(別名 "システム予約")を意味し、\ Device\Harddiskvolume2はC:用です。
だから問題は:Windows 7のインストールディスクのすべての\ Device\Harddiskvolumeを一覧表示する方法(BCD編集用)?
私が物事を成し遂げることができなかった理由は、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 !!!
これらのリンクは私にも役立ちました:
最後に、予備のWindowsがある場合は、 DriveLetterView を実行して、WindowsがHarddiskVolumeでどのように機能するかを確認します。
注:HarddiskVolumeはWMI/COM表記です
マウントされたボリュームを一覧表示する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:
何もインストールせず、Powershellスクリプトをいじる必要がない最も簡単な方法は、 System Information Viewer ポータブルWindowsアプリケーションです。このアプリは、マシン/ハードウェアに関するほぼすべての情報を提供するので素晴らしいです。ハードドライブ関連のデータの読み取りを提供するだけでなく、デバイスに関するほぼすべてを見つけることができます。さらに、それは非常に軽量ですが、TBH構造が少しわかりにくいです。
最後に、ドライブ情報をどのようにして見つけますか?ボリューム▼の下に、すべての概要を表示するオプションボリュームリストがあります\ Device\HarddiskvolumeXXがコンピューターに存在します。さらに、パーティションのドライブ文字とGUID=を取得します。
すべての\ Device\HarddiskVolumeXXを一覧表示するには、物理ドライバーごとのドライブ文字の下にマウントされていないものも含めて、ディスク番号(Windowsで見られるように)管理)。ボリューム▼ドロップダウンを開き、 ディスクマッピング を選択します。
また、\。\ PhysicalDriveXX、パス、ユニット、およびコントローラーIDを表示するオプションDrivesを強調表示したいと思います。ドライブマッピングの下のリストも非常に役立ちます。
[〜#〜] 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}\
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));
これはdiskpart
を使用して行うことができます。
ソリューション1:
diskpart
を実行します。
タイプlist volume
接続されているすべてのディスクボリュームを一覧表示する
タイプ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:
diskpart
を実行します。
タイプlist disk
接続されているすべてのディスクを一覧表示します。
タイプselect disk #
どこ #
はディスクの番号です。
タイプdetail disk
ディスクごとに手順3と4を繰り返します。
exit
と入力します
以下の出力例は、現在5つのボリュームを持つ3つのディスクがあることを示しています。
出力例:
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>
より簡単な方法は、以下のとおりです。いくつかの列もカスタマイズしました。
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