无忧启动论坛

标题: 再次请教个批处理问题 [打印本页]

作者: yigeren    时间: 2008-6-22 21:03
标题: 再次请教个批处理问题
有啥命令可以建立目录时不要指定盘符,就像GHOST时,可以这样指定第一硬盘的第二个分区dst=1:2

因为发现用指定的盘符建立目录,在WINDOWS或VISTA系统是正常的,但如果在PE系统下,有时会发现盘符错乱,

而导致备份或还原出错,比如WINDOWS系统的D盘,在PE系统有可能为F或E盘,这样偶直接指定D盘的Gho~1目录,就会

找不到盘符而备份或还原出错,出错这种的情况大多数是品牌机

请大家帮帮忙看有没有比较好的解决方法
作者: xypcmac    时间: 2008-6-22 21:56
Ghost 本来就是用 x:x 的形式来表示盘符路径。
作者: yigeren    时间: 2008-6-22 22:16
有啥好方法解决不??
作者: xypcmac    时间: 2008-6-22 22:47
据我所知,与Ghost系出同门的 omnifs32.exe   可以按 x:x 的形式来创建文件夹。但不支持畸形目录的创建。

其实,照你的情况,如果你备份和还原用盘符的形式怕出错,有一个办法可以弥补这个缺陷,你也用不着寻找不用指定创建文件夹的方法。前提是你所创建的文件夹是唯一的,如:某一畸形目录(一般很少人随便建立这种文件夹,所以还是有基本的保证)。

解决方法:

用 Ghost 备份和还原时,先检测你所建立的目录在哪里,然后把参数替换进Ghost里面。再操作就可以了。当然,如果你备份和还原的文件名是固定的,那么可以文件夹和文件同时定位。这样就更加可以保证唯一性了。
作者: yigeren    时间: 2008-6-22 23:22
具体GHOST的命令如何编写,偶建立的目录gho.(畸形目录)(因为这能防止删除)
麻烦你详细写个代码,谢谢了
上次那个备份的代码相信你也知道了,就是要按那个弄的
作者: xypcmac    时间: 2008-6-23 00:08
我简单的举一个例子,未测试...

@echo off
:: 检测安装时所建立目录的位置
set allDrive=c d e f g h i j k l m n o p q r s t u v w
for %%i in (%allDrive%) do if exist %%i:\gho~1 set f=%%i
if exist %f%: set gfile=%f%:\gho~1

:MyGhost
echo.
echo               备份(B)     还原(R)
Echo      ───────────────────
echo.
set Ighost=
set /p Ighost=  请选择你想要的操作》
if /i "%Ighost%"=="B" goto bak
if /i "%Ighost%"=="R" goto restore
goto MyGhost

:bak
:: 备份第一硬盘第一分区的镜像到X盘gho~1目录
Ghost32 -clone,mode=pdump,src=1:1,dst=%gfile%\sys.gho -Z9 -fx -sure
goto end


:restore
:: 从X盘gho~1目录的镜像恢复到第一硬盘第一分区
Ghost32 -clone,mode=pload,src=%gfile%\sys.gho:1,dst=1:1 -fx -sure
goto end

:end
作者: yigeren    时间: 2008-6-23 00:19
偶试试看,能不能把备份和还原分成两个批理处,不想在一个批处理文件内执行备份和还原

还有备份也应该加入检测是否有备份过了,也就是要检查sys.gho文件是否存在
作者: xypcmac    时间: 2008-6-23 00:31
:: 当然可以,把下面两行 goto ... 换成你的批处理(你不是没学过基本的命令吧)。

if /i "%Ighost%"=="B" bak.bat
if /i "%Ighost%"=="R" restore.bat

:: 文件检测(跟文件夹检测差不多啊):
for %%i in (%allDrive%) do if exist %%i:\gho~1\sys.gho set f=%%i
if exist %f%: set gfile=%f%:\gho~1&goto bakset

:: goto bakset 上面这个goto ... 后面就是接你询问是否重新备份的批处理段...
作者: yigeren    时间: 2008-6-23 00:36
偶测试可以了,剩下的就是要添加备份检测文件有存在否和弄成两个批处理文件的问题

这个偶自己慢慢弄了,如果不行再麻烦你了,你真的是一个热心人,好人,这么晚还帮在偶解决
问题,真的是很感谢

最后明天在到那些有问题的机子上再测试下
作者: yigeren    时间: 2008-6-23 00:37
汗。。。你回复真快,偶才发回帖了

偶有学过啊,其实你弄的这些代码偶基本是看得懂的,就是有一些复杂的命令不会弄
作者: xypcmac    时间: 2008-6-23 00:39
见笑了,我也是只会简单的,高手都没来,只能我献丑了...

[ 本帖最后由 xypcmac 于 2008-6-23 12:40 AM 编辑 ]
作者: yigeren    时间: 2008-6-23 01:46
呵呵,你这样还算简单啊,太谦虚了

这是偶修改完的代码,看需要再改进没,偶测试是可以的,就是以下这段代码启作用:

set allDrive=c d e f g h i j k l m n o p q r s t u v w
for %%i in (%allDrive%) do if exist %%i:\gho~1 set f=%%i
if exist %f%: set gfile=%f%:\gho~1


以下是备份文件的批处理代码:

@echo off
CLS
rem 一键备份C盘
:: 检测安装时所建立目录的位置
set allDrive=c d e f g h i j k l m n o p q r s t u v w
for %%i in (%allDrive%) do if exist %%i:\gho~1 set f=%%i
if exist %f%: set gfile=%f%:\gho~1
echo.
echo.
echo.
echo                         一键备份C盘  By:yigeren
echo.
echo.
echo                提示: 一旦"备份",立即执行,备份文件将保存在D盘!
echo.
echo                提示: 按"B"键,再按回车键,开始备份, 按"Q"键退出.
echo.
echo.
echo.
echo.
echo.
Set Choice=
Set /P Choice= 请选择备份或退出:
If "%Choice%"=="" Goto Call
If Not "%Choice%"=="" Set Choice=%Choice:~0,1%
If /I "%Choice%"=="B" Goto backup
If /I "%Choice%"=="Q" Exit
call backup.cmd
:backup
:: 文件检测
if exist %gfile%\yigeren.sys (
Cls
echo.
echo.
echo.
color 0c
echo                         系统已经备份过了&goto bakset
) else (
md d:\gho..\
cls
ghost32.exe -clone,mode=pdump,src=1:1,dst="%gfile%\yigeren.sys" -z3 -fx -sure
goto end
)
:Call
call backup.cmd
goto end

:bakset
echo.
echo.
echo                警告: 一旦"备份",立即执行,原有备份文件将被覆盖!
echo.
echo                重新备份系统请按"Y"键,再按回车键,退出请按"Q"键
echo.
echo.
echo.
Set b=
Set /P b= 请选择重新备份或退出:
if %b%#==# goto bakset
if /i %b%==Y goto reset
if /i %b%==Q goto end
cls
echo.
echo.
echo.
echo                         系统已经备份过了
goto bakset
goto end

:reset
cls
ghost32.exe -clone,mode=pdump,src=1:1,dst="%gfile%\yigeren.sys" -z3 -fx -sure
goto end
:end
作者: yigeren    时间: 2008-6-23 01:47
这个是还原文件的批处理代码:

@echo off
CLS
rem 一键恢复C盘
set allDrive=c d e f g h i j k l m n o p q r s t u v w
for %%i in (%allDrive%) do if exist %%i:\gho~1 set f=%%i
if exist %f%: set gfile=%f%:\gho~1
echo.
echo.
echo.
echo                         一键恢复C盘  By:yigeren
echo.
echo.
echo                警告: 一旦"恢复",立即执行,C盘数据将全部被覆盖!
echo.
echo                提示: 按"R"键,再按回车键,开始恢复, 按"Q"键退出.
echo.
echo.
echo.
echo.
echo.
Set Choice=
Set /P Choice= 请选择恢复或退出:
If "%Choice%"=="" Goto Call
If Not "%Choice%"=="" Set Choice=%Choice:~0,1%
If /I "%Choice%"=="R" Goto restore
If /I "%Choice%"=="Q" Exit
call restore.cmd
:restore
cls
ghost32.exe -clone,mode=pload,src="%gfile%\yigeren.sys:1",dst=1:1 -fx -sure
goto end
:Call
call restore.cmd
goto end
:end
作者: yigeren    时间: 2008-6-23 14:39
奇怪,在备份好后,然后再还原,再运行备份批处理文件系统就会蓝屏
作者: xypcmac    时间: 2008-6-23 19:50
先说说你上面那个批处理

备份:怎么检测的是文件,建立的是文件夹?
还原:没有检测和转换机制,如果文件不存在。操作者看到的是什么?

还有,我想了一下,觉得我们之前的所做的恢复菜单缺乏安全措施。我修改了一下检测机制。看起来似乎好点了。再测试一下看看有什么问题。

大家可以讨论一下,看看有什么好办法。
作者: yigeren    时间: 2008-6-24 00:41
备份的你说建立文件夹,是这个代码吗:md d:\gho..\     
我已经删除了

还原的是没加入检测机制,可以添加检测下如果找不到yigeren.sys,就提示系统没备份过。
作者: xypcmac    时间: 2008-6-24 01:00
无论在Wndows还是PE系统,第一次启动一键恢复,都需要检测备份文件夹是否存在,没有则新建(新建时还要分析在哪里新建好)。若存在备份文件夹,就要继续分析备份、恢复的目标位置在哪里才是正确的。

比如:你备份的时候只有1个硬盘两个分区,这简单了。但如果在下次恢复时,电脑临时增加了硬件,如用U盘启动PE(HD格式),你就必须检测恢复到哪里比较好。这样才比较安全。备份倒是没有问题,固定唯一的文件夹很好定位。
作者: yigeren    时间: 2008-6-24 01:27
还原的批处理需要改改了,如果有两个硬盘或像你所说的,用U盘启动后,把U盘识别成第一硬盘,那还原后,会把数据弄丢的,那可就惨了,我想是不是让它还原到指定的C盘,而不管它在第几硬盘的第几分区上,不过现在出现的蓝屏是哪出的问题?

[ 本帖最后由 yigeren 于 2008-6-24 10:07 AM 编辑 ]
作者: xypcmac    时间: 2008-6-24 12:16
1. 还原指定到C盘也不行,假设有两个硬盘,第一个硬盘主分区安装XP,第二个硬盘主分区安装了PE,如果是第二个硬盘启动PE的话,就会调换C盘和d盘。

2. 你是在什么环境出现蓝屏的?我想与你的批处理关系不大,你可以手动恢复一下,看看是否有同样问题就知道了。

我看还是老办法,结合 ghost 的磁盘检测信息 和 usb 检测来确定备份目录的位置以及还原的目标位置较好!第一步我已经做完。当U盘或USB移动硬盘只有1个分区的时候,多少USB设备都可以,基本没有什么问题了。
作者: yigeren    时间: 2008-6-24 12:31
我做的测试都在PE系统下测试,我用以前的简单批处理备份和还原,都不会出现蓝屏,但只要换成现在弄的这个,就会蓝屏,昨天已有反复测试过,在虚拟机上测试过,实机上也测试过
有时先备份再还原,再运行备份文件,就蓝屏,有时先运行还原,再备份,再运行还原,还是蓝屏
作者: xypcmac    时间: 2008-6-24 13:00
那你用我刚做的这个试试吧!先不要修改。在我这里实机试过没有问题。

[ 本帖最后由 xypcmac 于 2008-6-24 01:19 PM 编辑 ]

RfHD.rar

818 Bytes, 下载次数: 91, 下载积分: 无忧币 -2


作者: yigeren    时间: 2008-6-24 13:13
少了CHeckUSB.exe文件
作者: xypcmac    时间: 2008-6-24 13:20
没有什么事的,这个功能我还没有加入呢!刚才测试,忘记删除那行批处理而已。

重新下载吧!
作者: yigeren    时间: 2008-6-24 13:32
汗。。。还是出错,到这句提示出错了:set hp=%c:~0,1%:1
提示:此时不应有 1c:~-1
作者: xypcmac    时间: 2008-6-24 13:50
搞错了吧!不是 set hp=%c:~0,1%:1 出错!
是 这句 if %c:~0,1% GTR 1 if %c:~-1,1% GTR 1 goto RtHDSet 出错!
你看提示:此时不应有 1c:~-1 就知道了!

为什么?是因为你批处理运行的位置不可写Ghost32.exe临时文件 GHSTSTAT.TXT ?我用的是ghost32 11.02
作者: yigeren    时间: 2008-6-24 13:53
我用的是11.5的版本,GHSTSTAT.TXT有自动建立


晕,换了GHOST11.02版本才行,可运行后就直接恢复了,没显示选择菜单

[ 本帖最后由 yigeren 于 2008-6-24 01:59 PM 编辑 ]
作者: xypcmac    时间: 2008-6-24 14:18
正常!
那么表明你的备份目录在第一硬盘的第一分区之后(可能是1:2、1:3、1:4...)

出现备份菜单的情况是:当你的电脑有两个硬盘,并且备份目录在第二硬盘第一分区之后(可能是2:2、2:3、2:4...)。

1. 只有1个硬盘,这是最简单的,还需要选吗?
2. 两个硬盘,但 备份目录放在第二硬盘第一分区(即2:1)还需要选吗? 难道恢复到2:2?
作者: yigeren    时间: 2008-6-24 14:22
不是,需要一个交互过程,就是要还原前,要确定下,不然有时按错了,那就不好了

你不是还要添加一个检查U盘的
作者: xypcmac    时间: 2008-6-24 14:30
也是可以的!

但如果这样就不用太多检测了,直接提供选择菜单得了,因为所有都需要操作者决定。

恢复  1:1  按1
恢复  2:1  按2
恢复  3:1  按3
......

不用 ghost32 11.5 的原因:1.它不支持中文目录;2.速度稍为慢点;3.要求稍为高点;4.它提供的新功能我暂时用不到...
作者: yigeren    时间: 2008-6-24 14:39
不是这个意思,就是在批处理检测好正确恢复哪个盘前,需要操作者按Y键确认还原
而不是要显示那些菜单供用户选择,这样的选择菜单,对不懂电脑的人来说,根本不知道选择哪个,我们需要的只是让他们再确定下是否还原而已,而不需要让他们要选择恢复到哪

就像前面我那个还原文件一样,确认还原就按Y键,再按回车键,不还原按Q键退出,其它的不需要他们选择,那些他们根本看不懂


那个GHOST11.02貌似能恢复GHOST11.5备份的映像

[ 本帖最后由 yigeren 于 2008-6-24 02:43 PM 编辑 ]
作者: xypcmac    时间: 2008-6-24 14:49
你自己可以修改成你喜欢的啊!我平时没有用Windows的ghost恢复。偶尔用手动一下。
11.02 能恢复 11.5的文件,这我倒没有试过,只知道它明显的改变就是可以热备份C盘。
作者: yigeren    时间: 2008-6-24 14:59
好的,我试试修改下,不行再请教你

这个备份还原批处理我是要用在PE系统上的
作者: xypcmac    时间: 2008-6-24 15:11
其实,你要提示也很简单,我预留好了的,就是把 ghost 命令那一行上面的 “::”改成 “echo”,然后下面加上,echo 按任意键开始恢复&pause>nul 即可。如果要特定的键就要加上判断语句了。
作者: yigeren    时间: 2008-6-24 16:25
我改成这样,你帮我再看看有啥问题没

还有GHOST11.02是可以恢复GHOST11.5的映像,已测试过
RfHD.rar (1.77 KB, 下载次数: 89)
作者: xypcmac    时间: 2008-6-24 16:51
你改得很好啊!
为了操作者更加直观的知道即将要发生的动作,可以加入分区与盘符对应的功能。如图:




还有,你也看看恢复时还有什么没有考虑进去的。
除了我刚才说的一个缺陷:当U盘/USB移动硬盘两个分区,并且备份目录是建立在该盘的第二分区时。这时就要手动恢复了。不能用这个程序恢复。
作者: yigeren    时间: 2008-6-24 18:52
怎么自动识别那些盘符出来和备份文件显示的时间

显示盘符出来比较直观

[ 本帖最后由 yigeren 于 2008-6-24 07:00 PM 编辑 ]
作者: xypcmac    时间: 2008-6-24 19:23
获得对应的盘符;
for /f "tokens=2* delims= " %%d in ('type %Temp%\GHSTSTAT.TXT^|find /i ": 这里是要查找的对象: "') do set Drv2=%%d

获取文件时间的方法:


作者: yigeren    时间: 2008-6-24 20:04
谢谢了哈,偶再研究研究
GHSTSTAT.TXT^|find /i ": 这里是要查找的对象:
上面这个是要查GHSTSTAT.TXT文件里面的啥内容,如何把它表现出来
作者: yigeren    时间: 2008-6-25 02:38
这是我重新修改好的备份还原批处理,你再看看

发现有这样的问题,如果有两个硬盘,把畸形目录建立第2硬盘上,那在PE系统下,会把畸形目录所在的硬盘当第一硬盘来处理
也就是这个参数%hp%显示为1:1,但在Windows系统下则没有此问题,

今晚弄了一晚上了,一直在测试,好累!!!好象还有问题,忘了是啥,汗.......但主要是出在多硬盘上的问题,单硬盘的情况下,应该OK了

PS:因我的电脑刚好有两块硬盘,一个IDE和SATA,SATA硬盘是属于第2硬盘,系统装在SATA硬盘上

睡觉

cmd.rar (1.98 KB, 下载次数: 79)
作者: yigeren    时间: 2008-6-25 16:10
晕,有人下载没人反应..........
作者: xypcmac    时间: 2008-6-25 16:31
1. 备份批处理缺乏容错能力。如电脑上没有批处理定义的目录,就不能执行,什么都看不到。

2. 还原批处理有个地方你把用户输入由数字改为字母后,没有进行大小写转换。

   还有,批处理里面的“提示:C盘在第%c:~0,1%硬盘的位置” 这样的标识是对不上号的(你怎么知道是C盘?)。

3. 至于你提的问题,原因就是你的备份目录在第二硬盘第一分区,那么它就会提示备份第一硬盘第一分区。

用你的批处理测试过,我没有遇到你所说的问题。因为我的备份目录一般都不会建立在第二硬盘第一分区(是否把备份目录建立在该区,由备份批处理自动检测)。如果建立在该分区,表明该第二硬盘只有1个分区。而备份目录又建立在里面,那么恢复的目标就只有第一硬盘第一分区了(正常来讲)。

4. 基于上面的讨论,还有一些不可预知的问题,我想还是加上原系统盘的检测功能,使得备份和恢复更加直观,并且为正确的操作提供了参考信息。如图所示:





[ 本帖最后由 xypcmac 于 2008-6-25 04:33 PM 编辑 ]
作者: yigeren    时间: 2008-6-25 17:39
1.备份批处理的畸形目录,我用自解压软件建立,因为这样才能把畸形目录隐藏(在解压时运行建立畸形目录的代码,设定建立在D盘)

2.你说的还原文件大小写问题是这个代码吧:if  %ps%==A goto RtHPone   (已修正)
而这个:提示:C盘在第%c:~0,1%硬盘的位置(要如何准确定位)

3.D盘的畸形目录就是第一硬盘位置(我的电脑)

4.弄个简单的备份还原批处理,发现越弄越难,要牵涉考虑的问题还真多,毕竟自己对DOS命令不熟,只会些简单的命令操作,汗..........
作者: xypcmac    时间: 2008-6-25 18:50
1. 畸形目录建立在D盘,都如此吗?假设在PE环境下安装,C盘是U盘,D盘是第一硬盘第一分区,E盘是第一硬盘第二分区。这样你的备份目录不就建立在可能是系统盘的分区上了吗?

2. 关于C盘定位,我不知道你理解的C盘是什么概念。所以我无法给你准确答案。

3.  关于上面你所提的问题,确实是我没有考虑到的地方。就是你的备份目录在第一硬盘第二分区,而系统却在第2硬盘第一分区。可以对比检测到的系统盘盘符与在ghost中查得的盘符是否相等来修正。从而出现恢复选择菜单。

4. 做一键恢复,是需要不断的发现问题的,当然不是一两天就能搞定的,解决一个问题很简单,解决所有问题很难。要考虑的环境和实现的东西是很多的。不过,我觉得现在已经很好了啊!存在的基本是一些没想到的暗角了。

[ 本帖最后由 xypcmac 于 2008-6-25 06:52 PM 编辑 ]
作者: yigeren    时间: 2008-6-25 19:54
这个备份还原批处理是在PE环境下使用的,而安装PE系统的前提是在WINDOWS系统下操作的,所以不存在你所说的:C盘是U盘,D盘是第一硬盘第一分区,E盘是第一硬盘第二分区的情况,
不然就会在备份批处理里面添加建立畸形目录的代码了(也因为发现不能在PE系统下隐藏畸形目录,所以才这样做)
C盘定位,我是这样查的,在两个硬盘下,盘符是这样:第一硬盘:D盘,G盘,H盘
第二硬盘:C盘(系统盘),E盘,F盘
在PE系统下,如果两个硬盘都连接上,用GHOST备份还原工具查找显示的是这样:
D: 1:1
G: 1:2
H: 1:3
C: 2:1
E: 2:2
F: 2:3
然后用你提供的代码:%hp%测试下显示是什么,在两个硬盘情况下它显示为2:1
而2:1就是上面的C: 2:1所以确定为C盘在第2硬盘上,在一个硬盘情况下,%hp%显示为1:1,当然就是在第1硬盘上了(只有一个硬盘应该是不会出错的),不知道我这样测试是否合理,还有你再帮我把代码完善下吧
作者: xypcmac    时间: 2008-6-25 20:21
1. 电脑系统不能启动时,可能就需要用其它设备(如U盘)启动PE,然后安装PE到本机硬盘。这时...呵呵

2. 有一个简单的办法检测系统盘在哪里?还是值得考虑使用的,作为辅助!
即查找所有的盘,看是否有系统目录WINDOWS或特定文件(如:WINDOWS\explorer.exe)来定位系统盘辅助恢复和备份的正确性。然后用取得的盘符与ghost里面的相对应就基本可以确定备份到哪里恢复到哪里了。

3. 结合我们刚才的讨论,你重新修改一下,应该差不多了。
作者: yigeren    时间: 2008-6-26 00:11
因为这个PE系统主要是给不大懂电脑的人用,如果系统不能启动,那就需要我们来维护了
而我们当然知道如何操作了,所以这个问题应该不大,关于第2点偶再研究看看,不行就只能先这样了,再次谢谢你哈

PS:现在有一个构想,就是把PE系统文件也放在D盘或E盘的畸形目录里,这样可最大程度防止误删文件(也就保证系统损坏也可进入PE系统),
然后在添加一个批处理文件来检查XP系统的boot.ini文件是否存在,或boot.ini里面的内容有引导PE的信息没,如果发现BOOT文件不存在或里面的内容没有引导PE系统的信息,就从预先备份的文件还原到C盘,Vista系统的引导比较不容易破坏,所以可不用检查,不知道方法可行不

PS2:不想用那些隐藏分区或修改MBR的方法

[ 本帖最后由 yigeren 于 2008-6-26 01:26 AM 编辑 ]
作者: xypcmac    时间: 2008-6-26 09:33
修改一下路径是可以的!




欢迎光临 无忧启动论坛 (http://wuyou.net/) Powered by Discuz! X3.3