- # 设置窗口标题和颜色
- $Host.UI.RawUI.WindowTitle = "分区对齐查询"
- $Host.UI.RawUI.BackgroundColor = "DarkGreen"
- $Host.UI.RawUI.ForegroundColor = "White"
- Clear-Host
-
- Write-Host "磁盘分区对齐检查结果:`n"
-
- # 获取所有逻辑磁盘 (固定磁盘和可移动磁盘)
- $disks = Get-WmiObject Win32_LogicalDisk | Where-Object {
- $_.DriveType -eq 3 -or $_.DriveType -eq 2
- }
-
- foreach ($disk in $disks) {
- try {
- # 获取关联的分区信息
- $link = Get-WmiObject Win32_LogicalDiskToPartition | Where-Object {
- $_.Dependent -like "*$($disk.DeviceID)*"
- }
-
- if (-not $link) { continue }
-
- # 解析分区路径 (示例格式: \\PC\root\cimv2:Win32_DiskPartition.DeviceID="磁盘 #0,分区 #0")
- $partitionID = ($link.Antecedent -split 'DeviceID=')[1].Trim('"') -replace '"',''
- $partition = Get-WmiObject Win32_DiskPartition | Where-Object {
- $_.DeviceID -eq $partitionID
- }
-
- if (-not $partition) { continue }
-
- # 十六进制地址处理
- $startHex = $partition.StartingAddress -replace "^0x",""
- if ([string]::IsNullOrWhiteSpace($startHex)) {
- Write-Warning "分区 $($disk.DeviceID) 无有效起始地址,跳过检测"
- continue
- }
-
- # 转换十六进制
- $startAddress = if ([long]::TryParse($startHex, [System.Globalization.NumberStyles]::AllowHexSpecifier, $null, [ref]$null)) {
- [Convert]::ToInt64($startHex, 16)
- } else {
- Write-Warning "分区 $($disk.DeviceID) 起始地址格式无效: $startHex"
- continue
- }
-
- # 计算对齐状态
- $alignments = @(
- @{Name="4K"; Value=4096},
- @{Name="1M"; Value=1048576},
- @{Name="2M"; Value=2097152},
- @{Name="3M"; Value=3145728},
- @{Name="4M"; Value=4194304}
- ) | ForEach-Object {
- $isAligned = ($startAddress % $_.Value) -eq 0
- "$($_.Name)=$(if ($isAligned) {'是'} else {'否'})"
- }
-
- # 计算存储空间
- $totalGB = if ($disk.Size) { [Math]::Round($disk.Size/1GB, 2) } else { 0 }
- $freeGB = if ($disk.FreeSpace) { [Math]::Round($disk.FreeSpace/1GB, 2) } else { 0 }
-
- # 输出结果
- $diskType = if ($disk.DriveType -eq 3) { "Disk" } else { "Usb Disk" }
- Write-Host "$diskType $($disk.DeviceID)"
- Write-Host "总空间: ${totalGB}GB 可用: ${freeGB}GB $($alignments -join ' ')`n"
- }
- catch {
- Write-Warning "检测 $($disk.DeviceID) 时发生错误: $_"
- }
- }
- Write-Host "--- 完成, 按任意键退出 ---"
- $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
- pause
复制代码
|