// ****************************************************************************************************************
// F11_AutoCreatePartition.PQS:在第一块硬盘的最后建立第一个分区使用空间的1/2 + 200MB大小的主分区
// 本脚本的设计目标是适应各种情况的硬盘。
// 脚本创建者:Climbing(QQ:653668, Email:xclimbing@msn.com, Homepage:http://www.nufans.net/dvbbs)
// 创建日期:2004.03.17
// 目前本脚本运行状态:初步测试运行正常,但没有运行各种极限情况下的测试,因此需要进一步测试
// ****************************************************************************************************************
// 允许用户在操作后手工重新启动计算机,否则将自动重新启动计算机
Allow Manual Reboot
//默认情况下不检测坏扇区,提高操作速度
Set Default Bad Sector Test State OFF
// 选择第一块硬盘
Select Disk 1
//选择第一个分区
Select Partition First
Dim PriSize
// 检测第一个分区的使用空间,将PriSize设置成其使用空间的1/2再加上200M,否则恐怕不够用
PriSize = GetUsedAmount / 2 + 2048
// 检测当前硬盘上的主分区数量
Dim PriNum
Dim i
i = 1
PriNum = 0
Select Partition FIRST
DO WHILE i < GetTotalPartitions
IF IsPrimary Then
PriNum = PriNum + 1
End If
Select Partition Next
i = i + 1
Loop
IF IsPrimary Then
PriNum = PriNum + 1
End If
// 检测硬盘上是否有扩展分区,如果有,也算是一个主分区
dim ExtNum
ExtNum = GetPartitionNumber Extended
If ExtNum <> 0 Then
PriNum = PriNum + 1
End If
// 只有主分区数量小于4才可以继续
IF PriNum < 4 Then
// 如果存在扩展分区,则选择扩展分区,让它占满前后所有的未分配空间
If ExtNum <> 0 Then
Select Disk 1
Select Partition Extended
Resize Max
End if
// dOperPnum用来保存操作过多少分区
Dim dOperPnum
dOperPnum = 0
// bMove 用来判断是否进行了空间腾出操作,如果是,刚为后面的空间移动提供判断基础
Dim bMove
bMove = 0
// dLastOpPar保存最后一次操作的分区编号
Dim dLastOpPar
// 如果当前未分配空间数量已经满足需要,将不需要进行重新分配空间操作
If GetTotalUnallocatedSpaces < PriSize Then
//选择最后一个分区并判断其是否为主分区
Select Partition Last
Check
// FreeSpace用来保存已经腾出的空间
Dim FreeSpace
FreeSpace = 0
// NeedSpace用来保存还需要腾出多少空间
Dim NeedSpace
NeedSpace = PriSize
Dim dTmp
dTmp = 0
// 从最后一个分区循环往前操作以腾出需要的空间
i = 0
Do While FreeSpace < PriSize
// 将当前操作分区扩到最大
Resize Larger Max
// 检测该分区未使用空间是否满足要求,如果满足,空出需要空间,如果不满足,继续操作
IF GetUnusedAmount >= NeedSpace Then
//改变该分区的大小,在其后面空出需要大小的空间(即NeedSpace变量保存的值)
Resize Space After NeedSpace
FreeSpace = FreeSpace + NeedSpace
bMove = 1
Else
// 如果本分区剩余空间大于100M,则将本分区缩小未使用空间减100M的大小
If GetUnusedAmount > 100 Then
dTmp = GetUnusedAmount - 100
Resize Space After dTmp
FreeSpace = FreeSpace + dTmp
NeedSpace = PriSize - FreeSpace
bMove = 1
End If
End If
i = i + 1
dOperPnum = dOperPnum + 1
// 如果循环到了第一个分区但空间仍然不足,则直接退出循环
If i < GetTotalPartitions Then
Select Partition Previous
Check
dLastOpPar = GetPartitionNumber Next
Else If FreeSpace < PriSize Then
dLastOpPar = GetPartitionNumber First
Exit Loop
End If
Loop
End If
// 如果没有进行分区分割操作,两个原因:1、磁盘空间不足;2、未分配空间已经够用
If bMove = 0 Then
dLastOpPar = GetPartitionNumber First
dOperPnum = GetTotalPartitions
Select Partition First
Move Left Max
Else
// 开始将前一个循环中腾出的空间进行后移操作
Dim LastMoveParType
Dim CurParNum
i = 1
If bMove = 1 Then
Select Disk 1
Select Partition dLastOpPar
CurParNum = GetPartitionNumber Next
If IsPrimary Then
LastMoveParType = 1
Else
LastMoveParType = 0
End If
Do While i < dOperPnum
Select Partition Next
If IsPrimary Then
If LastMoveParType = 0 Then
Select Disk 1
Select Partition Extended
Resize Min
End If
Else
If LastMoveParType = 1 Then
Select Disk 1
Select Partition Extended
Resize Left Boundary Max
End If
End If
Select Partition CurParNum
Move Left Max
If IsPrimary Then
LastMoveParType = 1
Else
LastMoveParType = 0
End If
CurParNum = GetPartitionNumber Next
i = i + 1
Loop
// 选中最后的未分配空间(刚才空出的)
Select Unallocated After Selected Partition
//在硬盘最后创建指定大小的分区,分区卷标为SYS_GHOST,当然,你可以根据实际情况修改卷标。
Create /FS=FAT32 /LABEL=""
// 将这个分区转换为主分区