一、使用到的工具
1. testdisk -- 需下载
2. diskpart
3. devcon -- 需下载
二、目标:run.bat 磁盘序号 (磁盘序号可在磁盘管理器中查看)
三、实现步骤
1. testdisk 中的磁盘名称形式为/dev/sdX,其中X为[a-z],故需先将磁盘序号转换成testdisk 中磁盘名称的形式。可使用for /f %%i in ('command') do (set num=%%i)实现,command为转换磁盘序号[0-25]到[a-z]的小程序。
2. 使用testdisk进行恢复。命令:testdisk_win /debug /log /cmd /dev/sdX partition_i386,analyse,write
注意点:testdisk write分区之后通过管道自动输入Y,网上的方法echo Y|command 有时不能正常使用,最好使用type yes.txt|command,yes.txt中多保存几个Y。
更新1:可用testdisk_win /debug /log /cmd /dev/sdX partition_i386,analyse,noconfirm,write 替代。
3. 获取磁盘分区数量。使用diskpart。
echo select disk X > %GET_PART_QUANTITY_SCRIPT%
echo list partition >> %GET_PART_QUANTITY_SCRIPT%
for /f "tokens=1,2 delims= " %%m in ('diskpart /s %GET_PART_QUANTITY_SCRIPT% ^|findstr /r /c:"分区 [0-9]"') do (
set /a PartNum=%%n
)
4. 重新分配卷标。跟第3步类似。
四、疑难问题
1. XP下需要重启系统。
分析:实际上是重启的磁盘驱动器,使用devcon重启磁盘驱动器即可。根据系统版本(ver | findstr "5.1")特殊处理。
命令:devcon enable "@DISK_ID" devcon disable "@DISK_ID" devcon enable "@DISK_ID", 三个操作之间最好sleep几秒钟。
这里的难点是获取对应磁盘序号的DISK_ID,通过解析devcon status =DiskDrive输出实现。
2. WIN7下非管理员运行CMD,无法通过管道向testdisk 及 diskpart 传输数据。
分析:本想使用runas解决,后发现WIN7未激活,激活之后CMD默认以管理员打开。
五、 遗留问题
1. 无法按时间一步一步恢复。留待下篇解决。