|
|
- #code=65001
- ENVI^ EnviMode=1
- ENVI^ ForceLocal=1
- SET$ &NL=0d 0a
- // 检查管理员权限
- ENVI ?&isAdmin=ISADMIN
- IFEX $%&isAdmin%<>1,
- {
- MESS 请以管理员身份运行本程序!\n\n右键点击 PECMD.exe -> 以管理员身份运行@错误#OK
- EXIT FILE
- }
- // 全局变量
- SET &SELECTED_DISK_NUM=-1
- CALL @MainWindow
- _SUB MainWindow,W600H550,磁盘扇区清除工具,,#1,,-size
- ENVI @this.Font=10:Microsoft YaHei
-
- // ========== 磁盘选择 ==========
- GROU GrpDisk,L20T20W560H110,磁盘选择
-
- LABE LblDisk,L35T50W80H25,磁盘列表:,,0x000000,10
- LIST ListDisk,L120T47W350H150,CALL OnDiskSelect
- ITEM BtnRefresh,L480T47W80H25,刷新,CALL RefreshDiskList
-
- LABE LblDiskInfo,L35T75W530H25,,,0x008000,9
-
- // ========== 扇区范围 ==========
- GROU GrpSector,L20T140W560H110,扇区范围 (注意: 0号扇区是MBR/引导区!)
-
- LABE LblStart,L35T168W80H25,起始扇区:,,0x000000,10
- EDIT EdtStart,L120T165W100H25,0,,0x200,10
-
- LABE LblEnd,L250T168W80H25,结束扇区:,,0x000000,10
- EDIT EdtEnd,L335T165W100H25,100,,0x200,10
-
- LABE LblTotal,L460T168W100H25,共0个扇区,,0x808080,9
-
- LABE LblSectorHint,L35T200W500H25,,,0x808080,9
-
- // ========== 操作按钮 ==========
- GROU GrpAction,L20T260W560H150,操作选项
-
- ITEM BtnZeroFill,L40T290W140H40,清空指定扇区(填0),CALL ZeroFillSectors
- ITEM BtnReadSector,L200T290W140H40,读取扇区,CALL ReadSectorInfo
- ITEM BtnVerifyZero,L360T290W140H40,验证是否已清0,CALL VerifyZero
-
- ITEM BtnClearMBR,L40T345W140H40,清空MBR(前63扇区),CALL ClearMBR
- ITEM BtnClearGPT,L200T345W140H40,清空GPT表(前2MB),CALL ClearGPT
- CHEK ChkForce,L360T355W120H25,强制清空(不确认),,0
-
- // ========== 操作日志 ==========
- GROU GrpLog,L20T420W560H90,操作日志
- MEMO MemoLog,L35T435W530H65,,,0x24,9
-
- // 关闭按钮
- ITEM BtnClose,L490T490W70H25,关闭,KILL \
-
- CALL RefreshDiskList
- _END
- // ========== 获取磁盘列表 (参考 ListDiskVol 的方式) ==========
- _SUB RefreshDiskList
- ENVI @LblStatus=正在扫描磁盘...
- CALL AddLog 正在扫描物理磁盘...
-
- // 获取全部磁盘
- PART list disk,&&全部磁盘
- CALL AddLog 磁盘列表: %&全部磁盘%
-
- ENVI &&磁盘LIST=
- SET &D1=
-
- FORX * %&全部磁盘%,&磁盘,
- {
- CALC #&diskNum=%&磁盘%
-
- // 获取磁盘大小
- PART list disk %&diskNum%,&&磁盘信息
- MSTR &&size=<2>%&磁盘信息%
-
- // 格式化大小
- CALC &sizeGB=%&size% / 1073741824#2
- CALC &sizeMB=%&size% / 1048576#1
-
- SET &sizeShow=%&sizeMB% MB
- IFEX $%&sizeGB%>=1, SET sizeShow=%&sizeGB% GB
-
- // 获取磁盘上的盘符
- SET &driveLetters=
- FDRV &Drvs=*:
- FORX * %&Drvs%,&D,
- {
- PART list drv %&D%,&&V
- MSTR &&hd=<9>%&V%
- FIND $%&hd%=%&diskNum%,
- {
- FIND $%&driveLetters%=, SET driveLetters=%&D%! SET driveLetters=%&driveLetters% %&D%
- }
- }
- FIND $%&driveLetters%=, SET driveLetters=无盘符
-
- // 构建显示字符串
- SET &display=磁盘%&diskNum% %&sizeShow% [%&driveLetters%]
-
- CALL AddLog 添加: %&display%
-
- FIND $%&磁盘LIST%=,
- {
- SET &磁盘LIST=%&display%
- SET &D1=%&display%
- }
- {
- SET &磁盘LIST=%&磁盘LIST%|%&display%
- }
- }
-
- FIND $%&磁盘LIST%=,
- {
- SET &磁盘LIST=无可用磁盘
- CALL AddLog 错误: 未找到可用磁盘
- }
-
- ENVI @ListDisk.VAL=%&磁盘LIST%
- FIND $%&D1%<>, ENVI @ListDisk.SEL=%&D1%
-
- ENVI @LblStatus=就绪
- CALL OnDiskSelect
- _END
- // ========== 磁盘选择事件 ==========
- _SUB OnDiskSelect
- SET &diskName=%ListDisk%
- FIND $%&diskName%=, EXIT _SUB
- FIND $%&diskName%=无可用磁盘, EXIT _SUB
-
- // 提取磁盘号
- SED &diskNum=0,^磁盘,,%&diskName%
- SED &diskNum=0, .*,,%&diskNum%
- CALC #&diskNum=%&diskNum%
-
- SET &SELECTED_DISK_NUM=%&diskNum%
- ENVI @LblDiskInfo=已选择: %&diskName% (\\.\PhysicalDrive%&diskNum%)
-
- // 获取磁盘总容量和总扇区数
- PART list disk %&diskNum%,&&info
- MSTR &&size=<2>%&info%
-
- CALC §ors=%&size% / 512#0
- CALC &sizeMB=%&size% / 1048576#1
- CALC &sizeGB=%&size% / 1073741824#2
-
- ENVI @LblSectorHint=总容量: %&sizeGB% GB (%&sizeMB% MB), 共 %§ors% 个扇区
- CALL UpdateSectorInfo
- _END
- // ========== 更新扇区统计 ==========
- _SUB UpdateSectorInfo
- IFEX $%&SELECTED_DISK_NUM%<0, EXIT _SUB
-
- ENVI @EdtStart.Val=?;&startStr
- ENVI @EdtEnd.Val=?;&endStr
-
- SED &startNum=0,[^0-9],,%&startStr%
- SED &endNum=0,[^0-9],,%&endStr%
-
- CALC #&startVal=%&startNum%
- CALC #&endVal=%&endNum%
-
- IFEX $%&endVal%>%&startVal%,
- {
- CALC &total=%&endVal% - %&startVal% + 1
- ENVI @LblTotal=共%&total%个扇区
- }
- {
- IFEX $%&endVal%=%&startVal%,
- {
- ENVI @LblTotal=共1个扇区
- }
- {
- ENVI @LblTotal=共0个扇区
- }
- }
- _END
- // 监听编辑框变化
- ENVI @EdtStart.MSG=0x0200: CALL UpdateSectorInfo
- ENVI @EdtEnd.MSG=0x0200: CALL UpdateSectorInfo
- _SUB AddLog
- SET &msg=%~1
- DATE -space &now
- ENVI @MemoLog=%&now% %&msg%\n%MemoLog%
- _END
- // ========== 清空指定扇区 ==========
- _SUB ZeroFillSectors
- IFEX $%&SELECTED_DISK_NUM%<0, TEAM MESS 请先选择磁盘@错误#OK| EXIT _SUB
-
- ENVI @EdtStart.Val=?;&startStr
- ENVI @EdtEnd.Val=?;&endStr
-
- SED &start=0,[^0-9],,%&startStr%
- SED &end=0,[^0-9],,%&endStr%
-
- CALC #&startVal=%&start%
- CALC #&endVal=%&end%
-
- IFEX $%&startVal%<0, TEAM MESS 起始扇区无效@错误#OK| EXIT _SUB
- IFEX $%&endVal%<=0, TEAM MESS 结束扇区无效@错误#OK| EXIT _SUB
- IFEX $%&endVal%<%&startVal%, TEAM MESS 结束扇区必须大于起始扇区@错误#OK| EXIT _SUB
-
- CALC &count=%&endVal% - %&startVal% + 1
- CALC &sizeKB=%&count% * 512 / 1024#1
-
- ENVI @ChkForce.Val=?;&force
-
- IFEX $%&force%=0,
- {
- MESS 警告!\n\n磁盘: %&SELECTED_DISK_NUM% (\\.\PhysicalDrive%&SELECTED_DISK_NUM%)\n起始扇区: %&startVal%\n结束扇区: %&endVal%\n共 %&count% 个扇区 (%&sizeKB% KB)\n\n此操作将永久清除数据!\n\n确认执行?@危险操作#YN*10000$N
- FIND $%YESNO%<>YES, EXIT _SUB
- }
-
- CALL AddLog 开始清空磁盘%&SELECTED_DISK_NUM% 扇区 %&startVal% - %&endVal%
-
- SET &device=\\.\PhysicalDrive%&SELECTED_DISK_NUM%
- CALC &offset=%&startVal% * 512
-
- EXEC =!cmd.exe /c "PUTF -dd -bs=512 -count=%&count% "%&device%",%&offset%,zero"
-
- WAIT 3000
-
- CALL AddLog 完成: 已清空 %&count% 个扇区
- MESS 清空完成!\n\n磁盘: %&SELECTED_DISK_NUM%\n扇区: %&startVal% - %&endVal%\n共 %&count% 个扇区已填0@完成#OK
- _END
- // ========== 读取扇区 (参考 GETALLMBR 的方式) ==========
- _SUB ReadSectorInfo
- IFEX $%&SELECTED_DISK_NUM%<0, TEAM MESS 请先选择磁盘@错误#OK| EXIT _SUB
-
- ENVI @EdtStart.Val=?;&startStr
- SED §or=0,[^0-9],,%&startStr%
- CALC #§or=%§or%
-
- IFEX $%§or%<0, TEAM MESS 起始扇区无效@错误#OK| EXIT _SUB
-
- CALL AddLog 读取磁盘%&SELECTED_DISK_NUM% 扇区 %§or%
-
- SET &device=\\.\PhysicalDrive%&SELECTED_DISK_NUM%
- CALC &offset=%§or% * 512
-
- // 读取512字节
- SET &tempFile=%TEMP%\sector_%RANDOM%.bin
- GETF %&device%,%&offset%#512,&rawData
-
- IFEX $%&rawData%<>,
- {
- // 转换为十六进制显示
- SET &hexData=
- FORX * %&rawData%,&&byte,
- {
- FIND $%&hexData%=, SET &hexData=%&byte%! SET &hexData=%&hexData% %&byte%
- STRL &len=%&hexData%
- IFEX $%&len%>192, EXIT -
- }
-
- // 检查是否全0
- SET &isZero=是
- SED &check=0,00,,%&hexData%
- FIND $%&check%<>, SET &isZero=否
-
- MESS 扇区信息\n\n磁盘: %&SELECTED_DISK_NUM%\n扇区号: %§or%\n偏移: %&offset% 字节\n\n前128字节(十六进制):\n%&hexData%\n\n全0: %&isZero%@读取结果#OK
-
- CALL AddLog 完成: 扇区%§or% 前128字节已读取, 全0=%&isZero%
- }
- {
- CALL AddLog 错误: 无法读取扇区%§or%
- MESS 无法读取扇区 %§or%!\n\n可能原因:\n1. 扇区超出磁盘范围\n2. 权限不足@错误#OK
- }
- _END
- // ========== 验证是否已清0 ==========
- _SUB VerifyZero
- IFEX $%&SELECTED_DISK_NUM%<0, TEAM MESS 请先选择磁盘@错误#OK| EXIT _SUB
-
- ENVI @EdtStart.Val=?;&startStr
- ENVI @EdtEnd.Val=?;&endStr
-
- SED &start=0,[^0-9],,%&startStr%
- SED &end=0,[^0-9],,%&endStr%
-
- CALC #&startVal=%&start%
- CALC #&endVal=%&end%
-
- IFEX $%&startVal%<0, TEAM MESS 起始扇区无效@错误#OK| EXIT _SUB
- IFEX $%&endVal%<=0, TEAM MESS 结束扇区无效@错误#OK| EXIT _SUB
- IFEX $%&endVal%<%&startVal%, TEAM MESS 结束扇区必须大于起始扇区@错误#OK| EXIT _SUB
-
- CALL AddLog 验证磁盘%&SELECTED_DISK_NUM% 扇区 %&startVal% - %&endVal%...
-
- SET &device=\\.\PhysicalDrive%&SELECTED_DISK_NUM%
- SET &allZero=1
- SET &nonZeroList=
-
- // 检查前5个扇区(避免检查太多)
- CALC &maxCheck=%&startVal%+4
- IFEX $%&maxCheck%>%&endVal%, SET &maxCheck=%&endVal%
-
- FORX * %&startVal% %&maxCheck%,&&s,
- {
- CALC &offset=%&s% * 512
- GETF %&device%,%&offset%#64,&hexData
- SED &check=0,00,,%&hexData%
- FIND $%&check%<>,
- {
- SET &allZero=0
- SET &nonZeroList=%&nonZeroList% %&s%
- }
- }
-
- IFEX $%&allZero%=1,
- {
- CALL AddLog 验证通过: 已全部清0
- MESS 验证通过!\n\n磁盘%&SELECTED_DISK_NUM%\n扇区 %&startVal% - %&endVal%\n已全部清0。@验证结果#OK
- }
- {
- CALL AddLog 验证失败: 以下扇区非0 -> %&nonZeroList%
- MESS 验证失败!\n\n磁盘%&SELECTED_DISK_NUM%\n以下扇区存在非0数据: %&nonZeroList%@验证结果#OK
- }
- _END
- // ========== 清空MBR (前63扇区) ==========
- _SUB ClearMBR
- IFEX $%&SELECTED_DISK_NUM%<0, TEAM MESS 请先选择磁盘@错误#OK| EXIT _SUB
-
- ENVI @ChkForce.Val=?;&force
-
- IFEX $%&force%=0,
- {
- MESS 警告!\n\n磁盘: %&SELECTED_DISK_NUM%\n操作: 清空MBR (前63个扇区)\n\n这将删除磁盘的引导记录和分区表!\n磁盘将变成"未初始化"状态!\n\n确认执行?@危险操作#YN*10000$N
- FIND $%YESNO%<>YES, EXIT _SUB
- }
-
- CALL AddLog 开始清空磁盘%&SELECTED_DISK_NUM% MBR (前63扇区)
-
- SET &device=\\.\PhysicalDrive%&SELECTED_DISK_NUM%
- EXEC =!cmd.exe /c "PUTF -dd -bs=512 -count=63 "%&device%",0,zero"
-
- WAIT 3000
-
- // 通知系统更新
- PART update %&SELECTED_DISK_NUM%
-
- CALL AddLog 完成: 已清空MBR
- MESS MBR清空完成!\n\n磁盘: %&SELECTED_DISK_NUM%\n前63个扇区已被清空。\n\n磁盘现在显示为"未初始化"。@完成#OK
- _END
- // ========== 清空GPT表 (前2MB) ==========
- _SUB ClearGPT
- IFEX $%&SELECTED_DISK_NUM%<0, TEAM MESS 请先选择磁盘@错误#OK| EXIT _SUB
-
- ENVI @ChkForce.Val=?;&force
-
- IFEX $%&force%=0,
- {
- MESS 警告!\n\n磁盘: %&SELECTED_DISK_NUM%\n操作: 清空GPT表 (前2MB)\n\n这将删除磁盘的GPT分区表!\n磁盘将变成"未初始化"状态!\n\n确认执行?@危险操作#YN*10000$N
- FIND $%YESNO%<>YES, EXIT _SUB
- }
-
- CALL AddLog 开始清空磁盘%&SELECTED_DISK_NUM% GPT表 (前2MB)
-
- SET &device=\\.\PhysicalDrive%&SELECTED_DISK_NUM%
- // 清空前4096个扇区 (2MB = 4096扇区)
- EXEC =!cmd.exe /c "PUTF -dd -bs=512 -count=4096 "%&device%",0,zero"
-
- WAIT 3000
-
- // 通知系统更新
- PART update %&SELECTED_DISK_NUM%
-
- CALL AddLog 完成: 已清空GPT表
- MESS GPT表清空完成!\n\n磁盘: %&SELECTED_DISK_NUM%\n前2MB已被清空。\n\n磁盘现在显示为"未初始化"。@完成#OK
- _END
复制代码
本来是想弄成gui程序,双击运行,选择处理的磁盘,输入要清空的扇区开始和结束位置清空。
如果加参数运作就不弹出界面,直接按磁盘和扇区数开始清空
可是ai对pecmd编写代码一直有问题,就上面的,功能不正常。
所以这部分都去掉了,只做了一个命令行程序
|
|