在不使用fsutil的情况下获取驱动器号的扇区大小


2

我需要知道如何在使用fsutilPowerShell脚本的情况下获取驱动器号(例如C :)的扇区大小。Batch和VBS也可以接受。
fsutil工具非常适合此操作,因为它返回了我需要的确切数据:

fsutil fsinfo ntfsinfo C:
NTFS Volume Serial Number :        0x32946b93946b587d
NTFS Version   :                   3.1
LFS Version    :                   2.0
Number Sectors :                   0x000000003a0b6c84
Total Clusters :                   0x0000000007416d90
Free Clusters  :                   0x00000000010a9da5
Total Reserved :                   0x0000000000002c98
Bytes Per Sector  :                512
Bytes Per Physical Sector :        512
Bytes Per Cluster :                4096
Bytes Per FileRecord Segment    :  1024
--- etc ---

但是,我在使用许多不同Windows语言的环境中使用此脚本,Microsoft 出于无穷的智慧决定翻译输出:

fsutil fsinfo ntfsinfo c:
NTFS-Volumeseriennummer :          0xdc7ccd5b7ccd3156
NTFS-Version :                     3.1
LFS-Version :                      2.0
Anzahl der Sektoren :              0x0000000004eec7ff
Gesamtzahl Cluster :               0x00000000009dd8ff
Freie Cluster :                    0x000000000059183d
Insgesamt reserviert :             0x000000000000430e
Bytes pro Sektor :                 512
Bytes pro physischem Sektor :      512
Bytes pro Cluster :                4096
Bytes pro Dateidatensatzsegment :  1024
--- usw ---

我需要的信息-每个扇区的字节数-似乎无法从WMI中获得,因此我可以说“给我C的数据”,并尝试将磁盘级数据与卷级数据配对以尝试并拼凑查询失败。

我会对行号进行硬编码以从中获取数据,但是在fsutilWindows的各个版本中,从中返回的数据量并不一致。以上两个示例均取自Windows 10设备,我需要的数据位于第8行,而在Windows 7设备上则位于第7行。

有谁知道我获取这种数据的方式,以使i18n不会干扰它?唯一的选择是对我需要的数据的行号进行硬编码,并为我正在运行的Windows版本进行调整,这是不可靠的。

我正在寻找“每个扇区的字节数”,而不是“每个物理扇区的字节数”值。


“每个扇区的字节数”仅报告逻辑扇区大小。这几乎总是512。其他任何大小都会导致许多Windows实用程序出现故障。
harrymc

support.microsoft.com/en-us/help/2510009/... -它也可以为AF格式的驱动器中读取4096。
海鸥

Windows 8+基本上可以在4K纯模式下运行,但不是所有应用程序。见一节“已知的兼容性问题” 这篇文章。我目前甚至在新的10 TB磁盘上都看到“每扇区字节数”等于512,所以我相信您将需要努力获得真正的4K本机磁盘。
harrymc

尽管如此,很重要的一点是,我可以获取非512数据的信息。我很想假设512并用它来完成,但最终只会咬我一口。
海鸥

Answers:


1

这是一个将在Windows 7和Windows 10上测试的逻辑扇区大小的命令:

wmic partition where "DeviceID like '%Disk #0%#0%'" get BlockSize  | findstr /v BlockSize

或对于启动分区:

wmic partition where BootPartition=TRUE get BlockSize  | findstr /v BlockSize

甚至:

wmic partition where (BootPartition=TRUE and Type='GPT: System') get BlockSize  | findstr /v BlockSize

该命令获取DeviceID类似于指定字符串的分区信息。第DeviceID一个磁盘的将会是“磁盘#0,分区#0”,第二个磁盘将是“磁盘#1,分区#0”,等等。findstr需要该命令才能删除标题行。不需要提升的权限。

这是我计算机上的结果:

在此处输入图片说明


太好了,谢谢。我尝试了“ wmic分区> textfile.txt”,但是在那里没有看到任何磁盘标签。那双散列零百分比就是巫术,你能解释它在做什么吗?
海鸥

这是正则表达式的原始形式:%是一个通配符,表示任何字符串。在CMD中,您可以*改用。这是必需的,因为wmic出于某种原因在DeviceID包含逗号的情况下不允许在参数内使用逗号。
harrymc

得到它了。因此,您使用0,0作为设备ID。当我使用wmic partition大驱动器时(大概是我所有的东西都在这里)是0,3; 同一块物理驱动器上具有不同块大小的不同分区是否有(任何)风险?
海鸥

我不这么认为,但没有参考。
harrymc

不幸的是,选择0,0不能保证系统驱动器。在具有3个HDD的我的家用计算机上运行它,它显示最大的存档驱动器(没有操作系统)为0,0。我现在回到第1方块。
海鸥

1

您可以将fsutil的输出通过管道传递到Select-String并搜索“每扇区字节数”,“字节数专家”和其他语言版本,以获取具有所需信息的行,而与行号无关:

fsutil fsinfo ntfsinfo c: |
    select-string 'Bytes Per Sector|Bytes pro Sektor'

您可以使用正则表达式“或”运算符(|)将其他语言字符串添加到搜索字符串中。

基思


如果WMI不合作,看来这将是唯一的方法。我正在尝试不这样做。我知道如果我使用5种语言,那么交易失败者将是我省略的第六种。
海鸥

如果找不到匹配项,可以使用Get-Culture确定语言版本或输出“无法识别的语言”吗?
基思·米勒

如果我早就知道要使用哪种语言,那将不是什么大问题。问题在于该脚本将是GA,因此根据语言ID,我真的无法写出同一文本字符串的七千个不同版本。
海鸥

0

为什么不把它们全部都拿走,然后选择您想要的东西。

# Using cmd.exe
wmic partition get BlockSize, StartingOffset, Name, Index

# Results

<#
    BlockSize  Index  Name                   StartingOffset
    512        0      Disk #0, Partition #0  1048576
    512        1      Disk #0, Partition #1  472907776
    512        2      Disk #0, Partition #2  594542592
    512        3      Disk #0, Partition #3  508414656512
    512        4      Disk #0, Partition #4  510287413248
    512        0      Disk #1, Partition #0  135266304
    512        0      Disk #3, Partition #0  135266304
    512        0      Disk #2, Partition #0  135266304
#>


$wql = "SELECT Label, Blocksize, Name FROM Win32_Volume WHERE FileSystem='NTFS'"
Get-WmiObject -Query $wql -ComputerName '.' |
Select-Object Label, Blocksize, Name

# Results

<#
Label  Blocksize Name
-----  --------- ----
            4096 \\?\Volume{bba9420f-c375-409b-977a-b7d4f69b18e6}\
Root        4096 C:\
            4096 \\?\Volume{184c6e20-4659-4a3a-89e6-c529c69fe26b}\
            4096 \\?\Volume{3ebf588c-f842-4c69-9a93-2f241231667e}\
Data        4096 D:\
SDN         4096 E:\
EVO4TB      4096 F:\
#>

更新OP

可以在有或没有用户交互的情况下完成以上和以下内容。

Get-WmiObject -Class Win32_DiskPartition | 
  Select-Object -Property Name, BlockSize, Description, BootPartition 

或WMIC

 Start-Process -FilePath powershell `
 -ArgumentList '-NoExit', 'wmic --% partition get BlockSize, StartingOffset, Name, Index' 

它不是交互式脚本,因此不能依靠用户干预
seagull

我的回答并非特定于交互任何事物,可以在有或没有任何用户交互的情况下使用。甚至可以通过PowerShell直接完成WMIC位。
postanote
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.