sunkiss
发表于 2010-5-13 20:29:33
睡觉去了,明天再弄吧!刚刚发现在问题!在有些电脑上的,我的U盘进PE后会显示1:1,而本地硬盘显示2:1,这样分区表不知道有什么变化,明天用我那台电脑试试!
sunkiss
发表于 2010-5-14 11:42:24
本帖最后由 sunkiss 于 2010-5-14 11:49 编辑
还是不行!G: 1:5是我量产的USB-CDROM H:是剩余的空间量产的可移动磁盘,然后做了引导。i: j:是我的一动硬盘,上图看看!
怎么解决啊!Drive No. ActiveVolumeLabe Total (Mb) Free (Mb)
C: 1:1 A 49010 32708
D: 1:3 100006 10550
E: 1:4 105230 31560
F: 1:2 980 195
G: 1:5 昊宇科技 53 0
H: 3:1 A 昊宇科技 7420 2231
I: 2:3 102400 71459
J: 2:4 317989 57181
sunkiss
发表于 2010-5-14 11:55:40
还是不熟悉正则啊!
$sR = StringRegExp($str, '(:)\t(\d:\d+)\h*\tA\t', 3)
将3改成1和2都能正确显示!改成4直接不显示!
afan
发表于 2010-5-14 12:00:36
FileInstall('dsptw.exe', @TempDir & '\') ;将dsptw.exe文件打包进编译
RunWait(@ComSpec & ' /c ' & @TempDir & '\dsptw.exe /A /PDR > diskinfo.txt', @TempDir, 0) ;于dos下隐藏运行dsptw生成信息文本
$str = FileRead(@TempDir & '\diskinfo.txt') ;读取文本
$sR = StringRegExp($str, '(:)\t(\d:\d+)\h*\tA\t', 3) ;正则匹配活动分区
If Not @error Then MsgBox(0, 0, '活动分区 ' & $sR & ' No. ' & $sR)
FileDelete(@TempDir & '\dsptw.exe') ;删除临时文件
FileDelete(@TempDir & '\diskinfo.txt') ;删除临时文件
sunkiss
发表于 2010-5-14 12:39:42
本帖最后由 sunkiss 于 2010-5-14 12:47 编辑
厉害,解决了!你赶快收我为徒吧!你家在哪里?我去请你吃饭去!
刚刚发现28#republican 发的那个图那样显示很好,有没有错误一看就知道,可惜以我现在的技术是妄想!等我学习学习也试着弄弄,哈哈!
弄到这样我已经很满意了
afan
发表于 2010-5-14 13:46:42
那个不难#include <GuiListView.au3>
FileInstall('dsptw.exe', @TempDir & '\')
GUICreate("测试", 400, 200)
$ListView1 = GUICtrlCreateListView('Drive|No.|Active|VolumeLabe|Total (Mb)|Free (Mb)', 5, 5, 390, 150)
$BtSx = GUICtrlCreateButton('刷新/载入', 200, 165, 90, 25)
$BtExit = GUICtrlCreateButton('退出', 300, 165, 90, 25)
GUISetState()
_ld()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3, $BtExit
FileDelete(@TempDir & '\dsptw.exe')
FileDelete(@TempDir & '\diskinfo.txt')
Exit
Case $BtSx
_ld()
EndSwitch
WEnd
Func _ld()
_GUICtrlListView_DeleteAllItems($ListView1)
RunWait(@ComSpec & ' /c ' & @TempDir & '\dsptw.exe /A /PDR > diskinfo.txt', @TempDir, 0)
Local $str = FileRead(@TempDir & '\diskinfo.txt'), $i, $dt
Local $array = StringRegExp($str, '([^\t\r]*)[\t|\r]', 3)
If @error Then Return MsgBox(48, 0, '错误')
For $i = 2 To UBound($array) - 7 Step 6
$dt = $array[$i] & '|' & $array[$i + 1] & '|' & $array[$i + 2] & '|' & $array[$i + 3] & '|' & $array[$i + 4] & '|' & $array[$i + 5]
GUICtrlCreateListViewItem($dt, $ListView1)
Next
EndFunc ;==>_ld
sunkiss
发表于 2010-5-14 16:57:44
本帖最后由 sunkiss 于 2010-5-14 16:59 编辑
哈哈,有学习了,我是了一下很好用呵呵,我吧版版帮我弄的代码加进去了,还很好用!呵呵!
只是还有N多地方不懂正在啃帮助!
sunkiss
发表于 2010-5-14 18:11:39
老师,我又遇到问题了!1:RunWait(@ComSpec & ' /c "%systemroot%\GHOST32.EXE -clone,mode=pload,src=%IniDrv%\SYS\WINXPSP3.GHO:1,dst=%hao% -crcignore -sure -rb"', "", 0)
2:run(@ComSpec & ' /c ' & '%IniDrv%\SYS\ghost.cmd', "", 0)
3:_nDOS("%IniDrv%\SYS\ghost.cmd")以上代码都不能运行成功,1:那一条可以运行,但是GHOST报错,':'就是这个错误、2:、3:运行了没什么动静。
ghost.cmd的代码是@echo off
%systemroot%\GHOST32.EXE -clone,mode=pload,src=%IniDrv%\SYS\WINXPSP3.GHO:1,dst=%hao% -crcignore -sure -rb
exit单独运行ghost.cmd是成功的!
afan
发表于 2010-5-14 18:24:24
$g = '%systemroot%\GHOST32.EXE -clone,mode=pload,src=%IniDrv%\SYS\WINXPSP3.GHO:1,dst=%hao% -crcignore -sure -rb'
RunWait(@ComSpec & ' /c ' & $g, "", 0)这样呢?
sunkiss
发表于 2010-5-14 18:33:56
回复 39# afan
还是不行!
sunkiss
发表于 2010-5-14 18:35:30
我下班了,我明天再接着研究吧!下面是我在你基础上添加了代码!#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_outfile=立信科技.exe
#AutoIt3Wrapper_Res_Fileversion=0.0.0.0
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <Process.au3>
#include <GuiListView.au3>
#include <ListviewConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
FileInstall('PECMD.EXE', @TempDir & '\')
FileInstall('dsptw.exe', @TempDir & '\')
GUICreate("立信科技PE恢复系统", 545, 255)
$ListView1 = GUICtrlCreateListView('驱动器|分区编号|分区状态|卷标|已用空间(Mb)|剩余空间(Mb)', 5, 5, 535, 200, $LVS_EX_GRIDLINES, $LVS_REPORT)
$Bthf = GUICtrlCreateButton(' 还原系统 ', 10, 215, -1)
;$Btbf = GUICtrlCreateButton(' 备份系统 ', 110, -1)
$Btg = GUICtrlCreateButton('手动GHOST32', 85, 215, -1)
$Btp = GUICtrlCreateButton(' WINPM ', 210, -1)
$Btd = GUICtrlCreateButton(' DiskGenius ', 270, -1)
$BtSx = GUICtrlCreateButton('刷新/载入', 420, 215, -1)
$BtExit = GUICtrlCreateButton(' 退 出 ', 490, 215, -1)
GUISetState()
_ld()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $Bthf
_CQHF()
;Run(@ComSpec & ' /c %systemroot%\GHOST32.EXE -clone,mode=pload,src=%CurDrv%\SYS\WINXPSP3.GHO:1,dst=%act% -crcignore -sure -fx', @TempDir, 0)
FileDelete(@TempDir & '\diskinfo.txt')
Case -3, $BtExit
FileDelete(@TempDir & '\dsptw.exe')
FileDelete(@TempDir & '\diskinfo.txt')
Exit
Case -3, $Btg
Run(@ComSpec & ' /c ghost32.exe', @TempDir, 0)
FileDelete(@TempDir & '\dsptw.exe')
FileDelete(@TempDir & '\diskinfo.txt')
Exit
Case -3, $Btp
RunWait(@ComSpec & ' /c %systemroot%\WINPM\WINPM.EXE', @TempDir, 0)
FileDelete(@TempDir & '\diskinfo.txt')
_ld()
Case -3, $Btd
RunWait(@ComSpec & ' /c %IniDrv%\SYS\diskgen\DiskGenius.exe', @TempDir, 0)
FileDelete(@TempDir & '\diskinfo.txt')
_ld()
Case $BtSx
FileDelete(@TempDir & '\diskinfo.txt')
_ld()
EndSwitch
WEnd
Func _ld()
_GUICtrlListView_DeleteAllItems($ListView1)
RunWait(@ComSpec & ' /c ' & @TempDir & '\dsptw.exe /A /PDR > diskinfo.txt', @TempDir, 0)
Local $str = FileRead(@TempDir & '\diskinfo.txt'), $i, $dt
Local $array = StringRegExp($str, '([^\t\r]*)[\t|\r]', 3)
If @error Then Return MsgBox(48, '错误提示', '请确认当前系统分区的正确性')
For $i = 2 To UBound($array) - 7 Step 6
$dt = $array[$i] & '|' & $array[$i + 1] & '|' & $array[$i + 2] & '|' & $array[$i + 3] & '|' & $array[$i + 4] & '|' & $array[$i + 5]
GUICtrlCreateListViewItem($dt, $ListView1)
Next
EndFunc ;==>_ld
Func _CQHF()
Dim $flag
$flagg = ""
;_GUICtrlListView_DeleteAllItems($ListView1)
RunWait(@ComSpec & ' /c ' & @TempDir & '\dsptw.exe /A /PDR > diskinfo.txt', @TempDir, 0)
Local $strr = FileRead(@TempDir & '\diskinfo.txt')
Local $sR = StringRegExp($strr, '(:)\t(\d:\d+)\h*(\tA)\t', 3)
If @error Then
MsgBox(48, ' 错误提示', '请确认当前系统分区的正确性')
Else
Local $RS = $sR
Select
Case $RS = "3:1"
$flag = MsgBox(1, "错误提示", '系统检测到您的电脑有多块硬盘(大于等于2块),不能自动进行GHOST还原.')
Case $RS = "1:1"
$flag = MsgBox(1, "请确认当前系统分区的正确性", '本地活动磁盘的盘符是:' & $sR & '' & @CR & @CR & '对应的GHOST编号为:' & $sR & '')
;$flag = MsgBox(1, "请确认当前系统分区的正确性", '当前系统检测U盘分区编号是1:1 ' & @CR & @CR & '本地活动磁盘的盘符是:' & $sR & '' & @CR & @CR & '对应的GHOST编号为:' & $sR & '')
Case $RS = "2:1"
;$flag = MsgBox(1, "请确认当前系统分区的正确性", '当前系统检测U盘分区编号是2:1 ' & @CR & @CR & '本地活动磁盘的盘符是:' & $sR & '' & @CR & @CR & '对应的GHOST编号为:' & $sR & '')
$flag = MsgBox(1, "请确认当前系统分区的正确性", '本地活动磁盘的盘符是:' & $sR & '' & @CR & @CR & '对应的GHOST编号为:' & $sR & '')
;$flag = MsgBox(1, "请确认当前系统检测磁盘分区的正确性", '本地活动磁盘的盘符是:' & $sR & ''& @CR & @CR &'对应的GHOST编号为:'& $sR & ''& @CR & @CR &'当前系统检测U盘分区编号是2:1 ' & @CR & @CR &'驱动器分区编号分区状态' & @CR & @CR & ' ' & $sR & ' ' & $sR & ' ' & $sR & '')
EndSelect
If $flag = 1 Then
;RunWait(@ComSpec & ' /c ' & @TempDir & '\PECMD.EXE ENVI $CP=' & $sR & '', "", @SW_HIDE)
RunWait(@ComSpec & ' /c ' & @TempDir & '\PECMD.EXE ENVI $HAO=' & $sR & '', "", @SW_HIDE)
MsgBox(1, "点击确定进行还原操作", '马上要进行还原操作,请确认文件已经备份' & @CR & @CR & ' 数据无价,请谨慎操作。')
$g = '%systemroot%\GHOST32.EXE -clone,mode=pload,src=%IniDrv%\SYS\WINXPSP3.GHO:1,dst=%hao% -crcignore -sure -rb'
RunWait(@ComSpec & ' /c ' & $g, "", 0)
EndIf
EndIf
EndFunc ;==>_CQHF
sunkiss
发表于 2010-5-15 08:42:19
本帖最后由 sunkiss 于 2010-5-15 10:03 编辑
将$g = '%systemroot%\GHOST32.EXE -clone,mode=pload,src=%IniDrv%\SYS\WINXPSP3.GHO:1,dst=%hao% -crcignore -sure -rb'
里面的%IniDrv%换成d:把%hao%换成1:1成功,我再试试
好奇怪啊!系统变量%hao%=1:1是没错的,CMD下ECHO %hao% 就是1:1但是语句里%hao%出错!将%hao%换成'&$sR&'成功!我以为是环境变量的原因!
我用$gpml = EnvGet("IniDrv")然后把%IniDrv%换成'&$gpml&'又出错了!提示找不到文件,一看是盘符出错了!郁闷$gpml = EnvGet("IniDrv")
MsgBox(4096, "路径变量为:", $gpml)得到是空值!然而,echo %inidrv%得到的结果是d:
用%IniDrv%会提示X:\XXXXX的错误
经过研究改进我更郁闷了!
ghost提示d:\sys\winxpsp3.gho有问题,打不开!其实用ghost.cmd这个是可以的!郁闷!
RunWait(@ComSpec & ' /c ' & @TempDir & '\PECMD.EXE ENVI $HAO=' & $sR & '', "", @SW_HIDE)
RunWait(@ComSpec & ' /c ' & @TempDir & '\PECMD.EXE ENVI ', "", @SW_HIDE) ;这里是刷新环境变量!我刚加的,现在可以提示D:了,但是还是错误
%systemroot%\GHOST32.EXE -clone,mode=pload,src=%IniDrv%\SYS\WINXPSP3.GHO:1,dst=' & $sR & ' -crcignore -sure -rb$bl=EnvGet("inidrv")
MsgBox(4096,"提示",$bl)得到的也是空!郁闷由于目录不确定在PE下%IniDrv%这个变量正好是正确的!要不然就要搜索文件然后确定目录了!
pingfan5888
发表于 2010-12-29 09:06:25
学习了,,完整的代码呢。
pchome2000
发表于 2011-5-21 14:23:13
正则表达式比较强大。
pingfan5888
发表于 2011-12-27 13:27:20
强, 这个不错。。