找回密码
 加入
搜索
楼主: sunkiss

[AU3基础] 关于dsptw分区的bat转au3!【已经解决】

 火.. [复制链接]
 楼主| 发表于 2010-5-13 20:29:33 | 显示全部楼层
睡觉去了,明天再弄吧!刚刚发现在问题!在有些电脑上的,我的U盘进PE后会显示1:1,而本地硬盘显示2:1,这样分区表不知道有什么变化,明天用我那台电脑试试!
 楼主| 发表于 2010-5-14 11:42:24 | 显示全部楼层
本帖最后由 sunkiss 于 2010-5-14 11:49 编辑

还是不行!G: 1:5是我量产的USB-CDROM H:是剩余的空间量产的可移动磁盘,然后做了引导。i: j:是我的一动硬盘,上图看看!
怎么解决啊!
Drive   No.     Active  VolumeLabe      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  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2010-5-14 11:55:40 | 显示全部楼层
还是不熟悉正则啊!
$sR = StringRegExp($str, '([C-Z]:)\t(\d:\d+)\h*\tA\t', 3)
将3改成1和2都能正确显示!改成4直接不显示!
发表于 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, '([C-Z]:)\t(\d:\d+)\h*\tA\t', 3) ;正则匹配活动分区
If Not @error Then MsgBox(0, 0, '活动分区 ' & $sR[0] & ' No. ' & $sR[1])
FileDelete(@TempDir & '\dsptw.exe') ;删除临时文件
FileDelete(@TempDir & '\diskinfo.txt') ;删除临时文件
 楼主| 发表于 2010-5-14 12:39:42 | 显示全部楼层
本帖最后由 sunkiss 于 2010-5-14 12:47 编辑

厉害,解决了!你赶快收我为徒吧!你家在哪里?我去请你吃饭去!
刚刚发现28#republican 发的那个图那样显示很好,有没有错误一看就知道,可惜以我现在的技术是妄想!等我学习学习也试着弄弄,哈哈!
弄到这样我已经很满意了
发表于 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
 楼主| 发表于 2010-5-14 16:57:44 | 显示全部楼层
本帖最后由 sunkiss 于 2010-5-14 16:59 编辑

哈哈,有学习了,我是了一下很好用呵呵,我吧版版帮我弄的代码加进去了,还很好用!呵呵!
只是还有N多地方不懂正在啃帮助!
 楼主| 发表于 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是成功的!
发表于 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)
这样呢?
 楼主| 发表于 2010-5-14 18:33:56 | 显示全部楼层
回复 39# afan

还是不行!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 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, '([C-Z]:)\t(\d:\d+)\h*(\tA)\t', 3)
        If @error Then
                MsgBox(48, ' 错误提示', '请确认当前系统分区的正确性')
        Else
                Local $RS = $sR[UBound($sR) - 2]
                Select
                        Case $RS = "3:1"
                                $flag = MsgBox(1, "错误提示", '系统检测到您的电脑有多块硬盘(大于等于2块),不能自动进行GHOST还原.')
                        Case $RS = "1:1"
                                $flag = MsgBox(1, "请确认当前系统分区的正确性", '  本地活动磁盘的盘符是:' & $sR[0] & '' & @CR & @CR & '  对应的GHOST编号为:' & $sR[1] & '')
                                ;$flag = MsgBox(1, "请确认当前系统分区的正确性", '  当前系统检测U盘分区编号是1:1 ' & @CR & @CR & '  本地活动磁盘的盘符是:' & $sR[0] & '' & @CR & @CR & '  对应的GHOST编号为:' & $sR[1] & '')
                        Case $RS = "2:1"
                                ;$flag = MsgBox(1, "请确认当前系统分区的正确性", '  当前系统检测U盘分区编号是2:1 ' & @CR & @CR & '  本地活动磁盘的盘符是:' & $sR[0] & '' & @CR & @CR & '  对应的GHOST编号为:' & $sR[1] & '')
                                $flag = MsgBox(1, "请确认当前系统分区的正确性", '  本地活动磁盘的盘符是:' & $sR[0] & '' & @CR & @CR & '  对应的GHOST编号为:' & $sR[1] & '')
                                ;$flag = MsgBox(1, "请确认当前系统检测磁盘分区的正确性", '  本地活动磁盘的盘符是:' & $sR[0] & ''& @CR & @CR &'  对应的GHOST编号为:'& $sR[1] & ''& @CR & @CR &'  当前系统检测U盘分区编号是2:1 ' & @CR & @CR &'  驱动器  分区编号  分区状态' & @CR & @CR & '    ' & $sR[0] & '       ' & $sR[1] & '     ' & $sR[2] & '  ')
                EndSelect
                                If $flag = 1 Then
                                        ;RunWait(@ComSpec & ' /c ' & @TempDir & '\PECMD.EXE ENVI $CP=' & $sR[0] & '', "", @SW_HIDE)
                                        RunWait(@ComSpec & ' /c ' & @TempDir & '\PECMD.EXE ENVI $HAO=' & $sR[1] & '', "", @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
 楼主| 发表于 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[1]&'成功!我以为是环境变量的原因!
我用$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[1] & '', "", @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[1] & ' -crcignore -sure -rb
$bl=EnvGet("inidrv")
MsgBox(4096,"提示",$bl)
得到的也是空!郁闷由于目录不确定在PE下%IniDrv%这个变量正好是正确的!要不然就要搜索文件然后确定目录了!
发表于 2010-12-29 09:06:25 | 显示全部楼层
学习了,,完整的代码呢。
发表于 2011-5-21 14:23:13 | 显示全部楼层
正则表达式比较强大。
发表于 2011-12-27 13:27:20 | 显示全部楼层
强, 这个不错。。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 18:28 , Processed in 0.087274 second(s), 14 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表