2

Мне нужно знать, как получить размер сектора для буквы диска, например 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, на которой я работаю, что слишком ненадежно для рассмотрения.

Я ищу значение "Байт на сектор", а не значение "Байт на физический сектор".

3 ответа3

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 необходима для удаления строки заголовка. Повышенные разрешения не требуются для этого.

Это результат на моем компьютере:

0

Вы можете направить вывод fsutil в Select-String и выполнить поиск «Bytes Per Sector», «Bytes pro Sektor» и других вариантов языка, чтобы получить строку с нужной вам информацией, независимо от номера строки:

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

Вы можете добавить дополнительные строки языка в строку поиска с помощью оператора регулярного выражения 'или' (|).

Кит

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:\
#>

Обновление для ОП

Выше и ниже может быть сделано с или без взаимодействия с пользователем.

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' 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .