中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS疑难解答 & 问题讨论 (解答室) » 如何实现用dos程序自动调整分区大小????
« [1] [2] [3] [4] [5] [6] [7] »
作者:
标题: 如何实现用dos程序自动调整分区大小???? 上一主题 | 下一主题
mewf
中级用户




积分 344
发帖 55
注册 2004-3-7
状态 离线
『第 76 楼』:  

for windows 主要是 for dos 的在win9x/win2000/winXP下都没办法运行!所以才想到用for Windows版的!还有安装监测软件能不能给我说一个啊!谢谢拉

2004-3-18 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (41371200)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 77 楼』:  

安装监视软件你可以用RegShot,在安装PQ前后用它为注册表和C盘进行快照,然后比较两个快照就行了。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-3-18 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
mewf
中级用户




积分 344
发帖 55
注册 2004-3-7
状态 离线
『第 78 楼』:  

谢谢你

2004-3-19 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (41371200)  编辑帖子  回复  引用回复
walu
高级用户




积分 916
发帖 201
注册 2003-5-4
状态 离线
『第 79 楼』:  

Climbing兄,你好!

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

为什么这样做?因为从倒数第二个分区把空间空出来给最后一个分区,因要移动的数据多造成分区很慢;而很多电脑第一分区C盘往往比较大如有10G,若从它的尾部空出2G空间则不用移动数据,也就加快了分区的速度。当然对C盘分割时会考虑给它留下足够的剩余的空间的,IF GetUnusedAmount > PriSize  + 2048 Then
即它未使用的空间GetUnusedAmount要比分割的空间PriSize还要多2G才允许操作。

2004-3-19 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 80 楼』:  

你说的也有道理,但这样建立起来的主分区就不是在硬盘最后面了,而是在第一主分区后面,当然这样建立的主分区并不影响一键恢复的安装,应该是可行的。按你的要求是要先检测最后一个分区空间是否够用,如果不够,再检测第一个分区,如果仍然不够,按我的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



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-3-20 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
walu
高级用户




积分 916
发帖 201
注册 2003-5-4
状态 离线
『第 81 楼』:  

感谢 Climbing 兄!今天等你一个上午,终于得到你的帮助。我弄了一个上午也弄不清楚,没办法,自己是个电脑盲兼英文盲。
这个脚本经刚才测试完全通过。
      对于PQMAGIC自动无损分区我一直都在虚拟机测试,其实如果用到循环的话,在真实电脑上移动数据是很慢很慢的,试想,移动完最后一个分区数据还要移动倒数第二个,然后倒数第三。。。。。。所以我觉得V3脚本中的循环在理论上是完美的,但在实际中会造成进退两难:一旦开始分区就不能退出,要么等一个多小时至几个小时,要么退出就会造成分区表错误(退出更加万万不能)。
      所以我认为,要移动分区数据的话只能移动一个分区不要二个以上,否则还不如在WINDOWS下将要移动的分区的文件先转移到其它分区,再操作。
     因此,再烦请Climbing 兄帮我做这样一个脚本:先检测最后分区,若有足够空间则进行操作;如不够空间再检测第一个分区...;如不够再检测第二个分区(D盘),若有空间则从D盘前面部分(只能前面部分)截取需要的空间;D盘还不够空间,再从倒数第二个逻辑分区截取需要的空间给最后分区,然后从最后分区腾出空间,建立需要的主分区。
     Climbing 兄,在自动分区这个问题上最后一次麻烦你啦,真不好意思,但愿你能帮帮忙,谢谢!等你好消息。


2004-3-20 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
walu
高级用户




积分 916
发帖 201
注册 2003-5-4
状态 离线
『第 82 楼』:  

如果倒数第二个逻辑分区都还没有空间的话,就退出自动分区操作了。

2004-3-20 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 83 楼』:  

我上午考试去了,没有机会上网的。

我觉得V4的脚本基本上已经算是最终版本了,因为既然你最终就是要建立这个分区,迟早也要等这么长时间的,而v4版本中已经尽量考虑了各种情况,如果再要考虑你的情况,这个脚本就搞的太复杂了,还不如直接手工用pqmagic分这个区呢。你说是不是呢?毕竟程序就是程序,不可能考虑到所有的情况,关键时刻还要人参与。例如,你可以先手动将目标硬盘整理成最后一个分区有足够的空间(或者第一个分区有足够的空间),然后再运行该脚本进行分区的建立,毕竟,如果移动太多的分区也可能造成数据丢失的,在操作之前最好还是先备份数据。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-3-20 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
walu
高级用户




积分 916
发帖 201
注册 2003-5-4
状态 离线
『第 84 楼』:  

Climbing兄,能告诉我怎样定义倒数第二个分区吗?即在脚本中怎样表达倒数第二个分区?谢谢!

2004-3-20 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 85 楼』:  

关于你所说的倒数第二个分区在实际情况中是一个未知数,你明白吗?我举例说明:如果你的硬盘上只有一个分区,就没有倒数第二个分区,这是其中一种情况,另一种情况是,最后一个分区是一个主分区,而倒数第二个分区却是一个逻辑盘,还有可能最后一个分区是一个逻辑盘,而倒数第二个分区却是一个主分区,而这些都要考虑到你的程序中,你编程序考虑的太简单了,而程序如果考虑的这么简单,就肯定在运行时会经常出故障,而经常出故障的程序是没有意义的。

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

但是,在编写实际的脚本程序时,你要充分考虑到我前面所说的各种情况,否则程序运行就会出错或者与你的设想不一致的结局。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-3-20 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
walu
高级用户




积分 916
发帖 201
注册 2003-5-4
状态 离线
『第 86 楼』:  

无意中发现,用PQMAGIC 7。0PRO中的PQPB。RTC替换PQMAGIC 8。02中的同名文件后,PQMAGIC8。02也可以带参数CMD运行脚本文件了,而实际上运行的程序仍然是PQMAGIC8。02,只不过显示的是PQMAGIC7。0PRO。我试了一下子,并不会不稳定,替换后键入PQMAGIC /?后显示有CMD参数。
因我不懂编程等有关方面知识,所以这样会否有不妥地方?
是不是把PQPB。RTC中加一个有关CMD方面的内容就可以使PQMAGIC8。02使用脚本了?我觉得PQMAGIC8。02本来就是支持脚本的,只不过隐藏了。

2004-3-22 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 87 楼』:  

好发现!



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-3-22 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
moroko
高级用户




积分 919
发帖 198
注册 2004-1-17
状态 离线
『第 88 楼』:  

要是我就放弃PQ  因为无损分区是很慢的
慢的让人受不了
自杀的心都有



[此贴子已经被作者于2004-3-23 0:52:58编辑过]




2004-3-23 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
moroko
高级用户




积分 919
发帖 198
注册 2004-1-17
状态 离线
『第 89 楼』:  

我用ghost 备份了一个xp 大概 1个g  左右 然后使用脚本对硬盘分区
花去的时间 简直让人无发想象,我感觉还是算了
找个别的办法 ,解决这个分区问题
那到只有pq能办到吗????

2004-3-23 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 90 楼』:  



  Quote:
以下是引用moroko在2004-3-23 1:02:45的发言:
我用ghost&nbsp;备份了一个xp&nbsp;大概&nbsp;1个g&nbsp;&nbsp;左右&nbsp;然后使用脚本对硬盘分区
花去的时间&nbsp;简直让人无发想象,我感觉还是算了
找个别的办法&nbsp;,解决这个分区问题
那到只有pq能办到吗????

最快的办法是将硬盘上的所有数据都干掉然后重新分区,如果你觉得你的数据没有用的话这样做最快。否则,估计没有更好的办法。另外,我不明白你在分区之前用ghost备份xp干什么?只要你的分区没有逻辑错误,根本不需要这样干,另外,如果用pq分区的话,除非你的硬盘上有大量数据需要移动,否则应该速度是很快的。



偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2004-3-23 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (653668)  编辑帖子  回复  引用回复
« [1] [2] [3] [4] [5] [6] [7] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: