Her \ Aygıt \ Sabit Diski'ni listele.


7

DiskPart komutlarını "list" "volume" (hiç de değil), "disk" ve "partition" gibi denedim; ama hala çalışmıyor.

\ Device \ Harddiskvolume0 kullanılmıyor gibi gözüküyor, çünkü \ Device \ Harddiskvolume1 ilk Windows bölümü (aka "Sistem Ayrılmış") ve \ Device \ Harddiskvolume2 ise C içindir.

Öyleyse soru şudur: Windows 7 kurulum diskindeki her bir \ Device \ Harddiskvolume nasıl listelenir (BCD düzenleme için)?

Yanıtlar:


5

Monte edilen birimleri listeleyen bir powershell betiği bulundu:

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

Kaynak: http://www.morgantechspace.com/2014/11/Get-Volume-Path-from-Drive-Name-using-Powershell.html

Çıktı şöyle görünür:

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

Ne yazık ki, bu bir sürücü harfinin altına monte edilmemiş hacimleri listelemez.
phant0m

3

Hiçbir şey yüklemeden ve Powershell scriptleri ile uğraşmanın en kolay yolu, System Information Viewer ile taşınabilir bir Windows uygulaması olabilir. Bu uygulama harika çünkü makineniz / donanımınız hakkında neredeyse her türlü bilgiyi sağlıyor. Bu, yalnızca sabit sürücüyle ilgili verileri okumakla kalmaz, cihazınızla ilgili hemen hemen her şeyi bulabilir. Üstelik çok hafif ama TBH biraz kafa karıştırıcı bir yapıya sahipti.

Son olarak, sürücü bilgilerini nasıl buluyorsunuz? Ciltler ▼ altında , bilgisayarınızda bulunan tüm \ Device \ HarddiskvolumeXX ürününe genel bir bakış sağlayacak Birim Listesi seçeneği vardır . Ek olarak, bölümlerinizin sürücü harfini ve GUID'sini de alırsınız.

Disk numarası ile birlikte (Windows Disk Yönetimi'nde görüldüğü gibi) fiziksel sürücü başına herhangi bir sürücü harfinin altına monte edilmemiş olanlar dahil tüm \ Device \ HarddiskVolumeXX öğelerini listelemek için . Birimler ▼ açılır penceresini açın ve Disk Eşleme'yi seçin .

Ayrıca \. \ PhysicalDriveXX , yol, birim ve denetleyici kimliklerini görüntüleyen Sürücüler seçeneğini de vurgulamak istiyorum . Sürücü Eşleme altındaki liste de oldukça yararlı olabilir.


@ phant0m Önerilen düzenlemenizi aldım ve modlar tarafından reddedilse bile yazıya bir dereceye kadar entegre ettim. Eklenen bilgileri yararlı buluyorum, ancak orijinal yapılanmayı korudum ve bunun yerine yeni paragraf ekledim.
thex

Harika, teşekkürler! Neden reddedildiği hakkında bir fikrin var mı?
phant0m

@ phant0m "Bu düzenleme yazının yazarına yönelikti ve düzenleme olarak bir anlamı yok. Bir yorum ya da cevap olarak yazılmış olmalıydı."
thex

2

Windows'taki tüm Sabit Disk hacimlerini nasıl listeleyebilirim?

Bu kullanılarak yapılabilir diskpart.

1. Çözüm:

  1. Run diskpart.

  2. Tip list volumeekli disk birimleri tüm Listeye

  3. tip exit

Örnek çıktı:

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. Çözüm:

  1. Run diskpart.

  2. Tip list diskbağlı disklerin hepsi listelemek için.

  3. Tip diskin sayısıdır.select disk ##

  4. tip detail disk

  5. Her disk için 3. ve 4. adımları tekrarlayın.

  6. tip exit

Aşağıdaki örnek çıktı şu anda 5 birimde 3 disk bulunduğunu gösteriyor.

Örnek çıktı:

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>

Daha fazla okuma


2
Ayrıntılı cevap için teşekkürler, ancak doğru bir şekilde Windows tarafından okunabilen birimleri doğru diskten doğru şekilde gösteren depsite olduğu için bu hala işe yaramıyor; ancak bana \ Device \ HarddiskVolume listesini vermedi. \ Aygıt ağacını Windows 7 kurulum diskinden tamamen listelemenin bir yolu var mı?
X.LINK, 28.06.2016

Farklı adlı aynı şey. Volume 0== \Device\Harddiskvolume0, Volume 1== \Device\Harddiskvolume1, etc
DavidPostill

2
Çözümü buldum. Aslında, HarddiskVolume algılanan Windows bölümlerini yansıtmaz, fakat diskteki her bölümleri (hatta Windows olmayanlar) yansıtır.
X.LINK, 28.06.2017

5
@DavidPostill Ne yazık ki bu diskpartkomutların gösterdiği numaralar, mutlaka cihaz numaralarıyla eşleşmez. Örneğin, sistemimde Disk Volume 7\\?\Device\HarddiskVolume4
0'daki

2

İşleri yapamamamın sebebi HarddiskVolume’in DiskPart birimlerini yansıtmaması - ki yalnızca Windows tarafından okunabilen tüm birimleri listeler.

Aslında, Windows Gparted'de göründüğü gibi, Windows olmayanlar bile dahil diskteki her bölümle çalışır.

Örneğin, sda3'ten önce bir sda4'ünüz varsa, bu sonuncusu -sda4 sonra sda3- (HarddiskVolume4 sonra HarddiskVolume3) olarak gösterilir.

Bu nedenle, HarddiskVolume0'un esas olarak BCD'de bulunmadığı anlamına gelir.

Bunu anlamama yardımcı olan komutlar:

mountvol /L

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

Bu bağlantılar bana da yardımcı oldu:

Son olarak, eğer yedek bir Windows kullanıyorsanız, Windows'un HarddiskVolume ile nasıl çalıştığını görmek için DriveLetterView uygulamasını çalıştırın .

Not: HarddiskVolume bir WMI / COM gösterimidir.


1

@ Merle'nin cevabını MSDN'de belgelenen yaklaşımı kullanarak uyarladım . Bu, ayrıca sürücü mektubu olmayan cihazları veya bir dizine monte edilmiş birimleri de gösterir.

$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

Bunu yapmanın daha kolay bir yolu, aşağıda olduğu gibidir. Ayrıca birkaç tane sütun özelleştirdim.

Lütfen aşağıdakileri PowerShell'de çalıştırın:

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

Bu yalnızca PowerShell v3 içindir, Windows 7 için belirtilen ve varsayılan olarak v3 ile gelmeyen kullanıcı.
JasonXA

-1

Eğer sadece sisteminizin BCD mağazasının nerede olduğunu bulmak istiyorsanız, HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ hivelist kayıt defteri anahtarındaki \ REGISTRY \ MACHINE \ BCD00000000 değerine bakın. Evet, konumu 1. fiziksel diskin 1. bölümünde olsa bile \ Device \ HardDiskVolume1'den farklı olabilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.