web-dev-qa-db-ja.com

fsutilを使用せずにドライブ文字のセクターサイズを取得する

ドライブ文字のセクターサイズを取得する方法を知る必要があります。たとえば、C:、なし PowerShellスクリプトでfsutilを使用します。バッチと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 ---

必要な情報(セクターあたりのバイト数)は、「C:のデータを教えてください」と言うことができるように、WMIからすぐに利用できないようで、ディスクレベルのデータとボリュームレベルのデータをペアにして試してみます。クエリを一緒にパッチすることは失敗しました。

データを取得するために行番号をハードコーディングしますが、fsutilから返されるデータの量はWindowsのバージョン間で一貫していません。上記の両方の例は、必要なデータが8行目にあるWindows 10デバイスから取得したものですが、Windows7デバイスでは7行目にあります。

I18nが干渉しないようにこのデータを取得する方法を知っている人はいますか?唯一の代替策は、行番号からのデータをハードコーディングすることです。実行しているWindowsのバージョンに合わせて調整されているため、信頼性が低く、検討できません。

「物理セクターあたりのバイト数」の値ではなく、「セクターあたりのバイト数」を探しています。

3
seagull

これは、Windows7とWindows10でテストされた論理セクターサイズを取得するコマンドです。

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」になり、2番目のディスクの場合は「ディスク#1、パーティション#0」などになります。findstrコマンドはヘッダー行を削除するために必要です。これには、昇格された権限は必要ありません。

これは私のコンピューターでの結果です:

enter image description here

2
harrymc

Fsutilの出力をSelect-Stringにパイプし、「Bytes Per Sector」、「Bytes pro Sektor」、およびその他の言語バリエーションを検索して、行番号に関係なく、必要な情報を含む行を取得できます。

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

正規表現 'または'演算子(|)を使用して、検索文字列に言語文字列を追加できます。

キース

1
Keith Miller

それらすべてを手に入れて、あなたが求めているものを選択してみませんか。

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