不使用 fsutil 获取驱动器号的扇区大小

不使用 fsutil 获取驱动器号的扇区大小

我需要知道如何获取驱动器号的扇区大小,例如 C:,没有fsutil在 PowerShell 脚本中使用。批处理和 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: 的数据”,并且尝试将磁盘级数据与卷级数据配对以尝试拼凑查询但未能成功。

我会硬编码行号以从中获取数据,但返回的数据量fsutil在 Windows 的不同版本之间不一致。上面的两个示例均取自 Windows 10 设备,我需要的数据在第 8 行,但在 Windows 7 设备上,它在第 7 行。

有谁知道我如何获取这些数据,而 i18n 不会干扰它?唯一的选择是硬编码电话号码我需要来自我正在运行的 Windows 版本的数据,但这太不可靠了,不值得考虑。

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

答案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需要该命令来删除标题行。这不需要提升权限。

这是在我的电脑上的结果:

在此处输入图片描述

答案2

您可以将 fsutil 的输出通过管道传输到 Select-String,并搜索“Bytes Per Sector”、“Bytes pro Sektor”和其他语言变体,以获取包含所需信息的行,而不管行号如何:

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

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

基思

答案3

为什么不先把它们全部得到,然后选择您想要的呢?

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

相关内容