中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-15 11:59
47,813 主题排行 / 349,903 发帖 / 今日 1 篇 / 48,257 会员排行
DOS疑难解答 & 问题讨论 (解答室) » 如何实现用dos程序自动调整分区大小????
可打印版本  12,259 / 98
第76楼 mewf 发表于 2004-03-18 00:00
中级用户 发帖 55 积分 344
for windows 主要是 for dos 的在win9x/win2000/winXP下都没办法运行!所以才想到用for Windows版的!还有安装监测软件能不能给我说一个啊!谢谢拉
第77楼 Climbing 发表于 2004-03-18 00:00
铂金会员 发帖 2,753 积分 6,962 来自 河北保定
安装监视软件你可以用RegShot,在安装PQ前后用它为注册表和C盘进行快照,然后比较两个快照就行了。
第78楼 mewf 发表于 2004-03-19 00:00
中级用户 发帖 55 积分 344
谢谢你
第79楼 walu 发表于 2004-03-19 00:00
高级用户 发帖 201 积分 916
Climbing兄,你好!

因我对脚本及英文很不熟悉,想按自己意愿对你的脚本改动一些,却不成功。
我想实现这样的:首先检测最后一个分区,若有足够空间(即符合条件)就对它进行分割;若没有足够空间,则转到检测第一个分区(即主分区),若有足够空间,就对它进行分割;若没有足够空间就从倒数第二个分区循环往前操作以腾出需要的空间。
也就是说,原脚本中若检测最后一个分区没有足够空间时就转向倒数第二个分区,而现在我要求先转向第一主分区,然后才转到倒数第二个分区。

为什么这样做?因为从倒数第二个分区把空间空出来给最后一个分区,因要移动的数据多造成分区很慢;而很多电脑第一分区C盘往往比较大如有10G,若从它的尾部空出2G空间则不用移动数据,也就加快了分区的速度。当然对C盘分割时会考虑给它留下足够的剩余的空间的,IF GetUnusedAmount > PriSize + 2048 Then
即它未使用的空间GetUnusedAmount要比分割的空间PriSize还要多2G才允许操作。
第80楼 Climbing 发表于 2004-03-20 00:00
铂金会员 发帖 2,753 积分 6,962 来自 河北保定
你说的也有道理,但这样建立起来的主分区就不是在硬盘最后面了,而是在第一主分区后面,当然这样建立的主分区并不影响一键恢复的安装,应该是可行的。按你的要求是要先检测最后一个分区空间是否够用,如果不够,再检测第一个分区,如果仍然不够,按我的V3脚本进行操作,对吧?

下面是按照你的需要修改后的脚本:
// 允许用户在操作后手工重新启动计算机,否则将自动重新启动计算机
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 + 200

// 检测当前硬盘上的主分区数量
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 = PriSize Then
Resize Space After PriSize
// 选中最后的未分配空间(刚才空出的)
Select Unallocated After Selected Partition

//在硬盘最后创建指定大小的分区,分区卷标为SYS_GHOST,当然,你可以根据实际情况修改卷标。
Create /FS=FAT32 /LABEL="SYS_GHOST"

// 将这个分区转换为主分区
Convert To Primary
bDone = 1
End If

// 如果最后一个分区的空间不够用,则检测第一个分区空间是否够用,如果够用,仍然重复刚才的操作。
If bDone = 0 Then
Select Partition First
Check
Resize Larger Max
If GetUnusedAmount >= PriSize + 2048 Then
Resize Space After PriSize
// 选中最后的未分配空间(刚才空出的)
Select Unallocated After Selected Partition

//创建指定大小的分区,分区卷标为SYS_GHOST,当然,你可以根据实际情况修改卷标。
Create /FS=FAT32 /LABEL="SYS_GHOST"

// 将这个分区转换为主分区
Convert To Primary
bDone = 1
End If
End If

// 前面两个操作都没有成功的话,进行第三步操作,也是最复杂的操作,主要表现在耗时最长上
If bDone = 0 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 = 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 //If GetTotalUnallocatedSpaces < PriSize

// 如果没有进行分区分割操作,两个原因: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="SYS_GHOST"

// 将这个分区转换为主分区
Convert To Primary
End If // If bMove = 1
End If // If bMove = 0
End If // If bDone = 0
End If // If PriNum < 4
第81楼 walu 发表于 2004-03-20 00:00
高级用户 发帖 201 积分 916
感谢 Climbing 兄!今天等你一个上午,终于得到你的帮助。我弄了一个上午也弄不清楚,没办法,自己是个电脑盲兼英文盲。
这个脚本经刚才测试完全通过。
对于PQMAGIC自动无损分区我一直都在虚拟机测试,其实如果用到循环的话,在真实电脑上移动数据是很慢很慢的,试想,移动完最后一个分区数据还要移动倒数第二个,然后倒数第三。。。。。。所以我觉得V3脚本中的循环在理论上是完美的,但在实际中会造成进退两难:一旦开始分区就不能退出,要么等一个多小时至几个小时,要么退出就会造成分区表错误(退出更加万万不能)。
所以我认为,要移动分区数据的话只能移动一个分区不要二个以上,否则还不如在WINDOWS下将要移动的分区的文件先转移到其它分区,再操作。
因此,再烦请Climbing 兄帮我做这样一个脚本:先检测最后分区,若有足够空间则进行操作;如不够空间再检测第一个分区...;如不够再检测第二个分区(D盘),若有空间则从D盘前面部分(只能前面部分)截取需要的空间;D盘还不够空间,再从倒数第二个逻辑分区截取需要的空间给最后分区,然后从最后分区腾出空间,建立需要的主分区。
Climbing 兄,在自动分区这个问题上最后一次麻烦你啦,真不好意思,但愿你能帮帮忙,谢谢!等你好消息。
第82楼 walu 发表于 2004-03-20 00:00
高级用户 发帖 201 积分 916
如果倒数第二个逻辑分区都还没有空间的话,就退出自动分区操作了。
第83楼 Climbing 发表于 2004-03-20 00:00
铂金会员 发帖 2,753 积分 6,962 来自 河北保定
我上午考试去了,没有机会上网的。

我觉得V4的脚本基本上已经算是最终版本了,因为既然你最终就是要建立这个分区,迟早也要等这么长时间的,而v4版本中已经尽量考虑了各种情况,如果再要考虑你的情况,这个脚本就搞的太复杂了,还不如直接手工用pqmagic分这个区呢。你说是不是呢?毕竟程序就是程序,不可能考虑到所有的情况,关键时刻还要人参与。例如,你可以先手动将目标硬盘整理成最后一个分区有足够的空间(或者第一个分区有足够的空间),然后再运行该脚本进行分区的建立,毕竟,如果移动太多的分区也可能造成数据丢失的,在操作之前最好还是先备份数据。
第84楼 walu 发表于 2004-03-20 00:00
高级用户 发帖 201 积分 916
Climbing兄,能告诉我怎样定义倒数第二个分区吗?即在脚本中怎样表达倒数第二个分区?谢谢!
第85楼 Climbing 发表于 2004-03-20 00:00
铂金会员 发帖 2,753 积分 6,962 来自 河北保定
关于你所说的倒数第二个分区在实际情况中是一个未知数,你明白吗?我举例说明:如果你的硬盘上只有一个分区,就没有倒数第二个分区,这是其中一种情况,另一种情况是,最后一个分区是一个主分区,而倒数第二个分区却是一个逻辑盘,还有可能最后一个分区是一个逻辑盘,而倒数第二个分区却是一个主分区,而这些都要考虑到你的程序中,你编程序考虑的太简单了,而程序如果考虑的这么简单,就肯定在运行时会经常出故障,而经常出故障的程序是没有意义的。

我按最简单的意义来说吧,假设你的硬盘上肯定有两个以上的分区:
那么:Select Partition Last是选择最后一个分区,接着运行一条命令:Select Partition Previous就是选择刚才选择的那一个分区前面的一个分区,这不就是倒数第二个分区了吗?
所以综合起来下面两个语句就是选择硬盘上的倒数第二个分区:
Select Partition Last
Select Partition Previous

但是,在编写实际的脚本程序时,你要充分考虑到我前面所说的各种情况,否则程序运行就会出错或者与你的设想不一致的结局。
第86楼 walu 发表于 2004-03-22 00:00
高级用户 发帖 201 积分 916
无意中发现,用PQMAGIC 7。0PRO中的PQPB。RTC替换PQMAGIC 8。02中的同名文件后,PQMAGIC8。02也可以带参数CMD运行脚本文件了,而实际上运行的程序仍然是PQMAGIC8。02,只不过显示的是PQMAGIC7。0PRO。我试了一下子,并不会不稳定,替换后键入PQMAGIC /?后显示有CMD参数。
因我不懂编程等有关方面知识,所以这样会否有不妥地方?
是不是把PQPB。RTC中加一个有关CMD方面的内容就可以使PQMAGIC8。02使用脚本了?我觉得PQMAGIC8。02本来就是支持脚本的,只不过隐藏了。
第87楼 Climbing 发表于 2004-03-22 00:00
铂金会员 发帖 2,753 积分 6,962 来自 河北保定
好发现!
第88楼 moroko 发表于 2004-03-23 00:00
高级用户 发帖 198 积分 919
要是我就放弃PQ 因为无损分区是很慢的
慢的让人受不了
自杀的心都有



第89楼 moroko 发表于 2004-03-23 00:00
高级用户 发帖 198 积分 919
我用ghost 备份了一个xp 大概 1个g 左右 然后使用脚本对硬盘分区
花去的时间 简直让人无发想象,我感觉还是算了
找个别的办法 ,解决这个分区问题
那到只有pq能办到吗????
第90楼 Climbing 发表于 2004-03-23 00:00
铂金会员 发帖 2,753 积分 6,962 来自 河北保定
以下是引用moroko在2004-3-23 1:02:45的发言:
我用ghost&nbsp;备份了一个xp&nbsp;大概&nbsp;1个g&nbsp;&nbsp;左右&nbsp;然后使用脚本对硬盘分区
花去的时间&nbsp;简直让人无发想象,我感觉还是算了
找个别的办法&nbsp;,解决这个分区问题
那到只有pq能办到吗????


最快的办法是将硬盘上的所有数据都干掉然后重新分区,如果你觉得你的数据没有用的话这样做最快。否则,估计没有更好的办法。另外,我不明白你在分区之前用ghost备份xp干什么?只要你的分区没有逻辑错误,根本不需要这样干,另外,如果用pq分区的话,除非你的硬盘上有大量数据需要移动,否则应该速度是很快的。
上一页  13 4 5 6 7  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023