[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[技术讨论] 分区对齐查询的PowerShell脚本

  1. # 设置窗口标题和颜色
  2. $Host.UI.RawUI.WindowTitle = "分区对齐查询"
  3. $Host.UI.RawUI.BackgroundColor = "DarkGreen"
  4. $Host.UI.RawUI.ForegroundColor = "White"
  5. Clear-Host
  6. Write-Host "磁盘分区对齐检查结果:`n"
  7. # 获取所有逻辑磁盘 (固定磁盘和可移动磁盘)
  8. $disks = Get-WmiObject Win32_LogicalDisk | Where-Object {
  9.     $_.DriveType -eq 3 -or $_.DriveType -eq 2
  10. }
  11. foreach ($disk in $disks) {
  12.     try {
  13.         # 获取关联的分区信息
  14.         $link = Get-WmiObject Win32_LogicalDiskToPartition | Where-Object {
  15.             $_.Dependent -like "*$($disk.DeviceID)*"
  16.         }
  17.         if (-not $link) { continue }
  18.         # 解析分区路径 (示例格式: \\PC\root\cimv2:Win32_DiskPartition.DeviceID="磁盘 #0,分区 #0")
  19.         $partitionID = ($link.Antecedent -split 'DeviceID=')[1].Trim('"') -replace '"',''
  20.         $partition = Get-WmiObject Win32_DiskPartition | Where-Object {
  21.             $_.DeviceID -eq $partitionID
  22.         }
  23.         if (-not $partition) { continue }
  24.         # 十六进制地址处理
  25.         $startHex = $partition.StartingAddress -replace "^0x",""
  26.         if ([string]::IsNullOrWhiteSpace($startHex)) {
  27.             Write-Warning "分区 $($disk.DeviceID) 无有效起始地址,跳过检测"
  28.             continue
  29.         }
  30.         # 转换十六进制
  31.         $startAddress = if ([long]::TryParse($startHex, [System.Globalization.NumberStyles]::AllowHexSpecifier, $null, [ref]$null)) {
  32.             [Convert]::ToInt64($startHex, 16)
  33.         } else {
  34.             Write-Warning "分区 $($disk.DeviceID) 起始地址格式无效: $startHex"
  35.             continue
  36.         }
  37.         # 计算对齐状态
  38.         $alignments = @(
  39.             @{Name="4K";  Value=4096},
  40.             @{Name="1M";  Value=1048576},
  41.             @{Name="2M";  Value=2097152},
  42.             @{Name="3M";  Value=3145728},
  43.             @{Name="4M";  Value=4194304}
  44.         ) | ForEach-Object {
  45.             $isAligned = ($startAddress % $_.Value) -eq 0
  46.             "$($_.Name)=$(if ($isAligned) {'是'} else {'否'})"
  47.         }
  48.         # 计算存储空间
  49.         $totalGB  = if ($disk.Size)       { [Math]::Round($disk.Size/1GB, 2) }       else { 0 }
  50.         $freeGB   = if ($disk.FreeSpace)  { [Math]::Round($disk.FreeSpace/1GB, 2) }  else { 0 }
  51.         # 输出结果
  52.         $diskType = if ($disk.DriveType -eq 3) { "Disk" } else { "Usb Disk" }
  53.         Write-Host "$diskType $($disk.DeviceID)"
  54.         Write-Host "总空间: ${totalGB}GB  可用: ${freeGB}GB  $($alignments -join '  ')`n"
  55.     }
  56.     catch {
  57.         Write-Warning "检测 $($disk.DeviceID) 时发生错误: $_"
  58.     }
  59. }
  60. Write-Host "--- 完成, 按任意键退出 ---"
  61. $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  62. pause
复制代码
1

评分人数

学习学习,感谢分享。

TOP

返回列表