找回密码
 加入
搜索
查看: 24616|回复: 48

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

 火.. [复制链接]
发表于 2010-5-12 17:36:50 | 显示全部楼层 |阅读模式
本帖最后由 sunkiss 于 2010-5-15 12:54 编辑

在网上找了个批处理,然后改了一下,在PE下用过能用不知道怎么改成AU3了,学些AU32天了,还是没学会!急着用没找到好办法,AU3有点难学,看来是没有速成的办法了!请高手帮忙吧!各位老大帮忙的时候别忘了给我这个菜鸟加上个注释啊!
这个批处理改的就是这个地址上看到的
http://hi.baidu.com/%C6%BD%B0%B2 ... 198d352797910f.html
@echo off
for /f "skip=2 tokens=1,2" %%i in ('dsptw /a /pdr /y') do echo %%i %%j>>ppp.txt
    for /f "tokens=1,2" %%i in ('type ppp.txt^|find /i "c:"') do set c=%%j
       for /f "tokens=1,2" %%i in ('type ppp.txt^|find /i "d:"') do set d=%%j
for %%d in (c d e f g h i j k l m n o p q r s t u v w) do if exist %%d:\beifen\sys~1\GHOST.exe set disky=%%d:\

%disky%beifen\sys~1\GHOST.exe -CLONE,MODE=PDUMP,SRC=%c%,DST=%d%\beifen\sys~1\SYS.GHO -Z9 -AUTONAME -sure -rb -fro -quiet 
在afan版版帮助下成功了许多了!就是还是不很明白!把代码分享给大家!我的是在PE下用,所以我把活动分区对应的盘符和那个N:N用PECMD.EXE写到系统环境变量可以随时调用。
FileInstall('dsptw.exe', @TempDir & '\') ;将dsptw.exe文件打包进编译
FileInstall('PECMD.EXE', @TempDir & '\') ;将PECMD.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) ;正则匹配活动分区,[从C到Z]、\t匹配一个制表符、\d、匹配一个数字字符、:???
If Not @error Then MsgBox(0, 0, '活动分区 ' & $sR[0] & ' No. ' & $sR[UBound($sR) - 1])
RunWait(@ComSpec & ' /c ' & @TempDir & '\PECMD.EXE ENVI $CP='&$sR[0]&'',"", @SW_HIDE)
RunWait(@ComSpec & ' /c ' & @TempDir & '\PECMD.EXE ENVI $HAO='&$sR[UBound($sR) - 1]&'',"", @SW_HIDE)
If Not @error Then MsgBox(0, 0, '活动分区 ' & $CP & ' No. ' & $HAO)
;$sR = StringRegExp($str, '([C-Z]:)\t(\d:\d+)', 3) ;正则匹配所有分区及位置
;If Not @error Then MsgBox(0, 0, '最后分区 ' & $sR[UBound($sR) - 2] & ' No. ' & $sR[UBound($sR) - 1])
;FileDelete(@TempDir & '\dsptw.exe') ;删除临时文件
;FileDelete(@TempDir & '\diskinfo.txt') ;删除临时文件
这个有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()
                        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()
        Local $varrr = DriveGetDrive('all'), $gho = '\SYS\WINXPSP3.GHO'
        For $i = 2 To $varrr[0]
                If FileExists($varrr[$i] & $gho) Then ExitLoop 
        Next
        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] & '' & @CR & @CR & 'WINXPSP3.GHO的路径是:' & @CR & @CR & ''&$varrr[$i]&$gho&'')
                        Case $RS = "2:1"
                                $flag = MsgBox(1, "请确认当前系统分区的正确性", '  本地活动磁盘的盘符是:' & $sR[0] & '' & @CR & @CR & '  对应的GHOST编号为:' & $sR[1] & '')
                EndSelect
                                If $flag = 1 Then
                                        Local $flagg=MsgBox(1, "点击确定进行还原操作", '马上要进行还原操作,请确认文件已经备份' & @CR & @CR & '        数据无价,请谨慎操作。')
                                        If $flagg = 1 Then
                                        Run(@ComSpec & ' /c %systemroot%\GHOST32.EXE -clone,mode=pload,src='&$varrr[$i]&'\SYS\WINXPSP3.GHO:1,dst=' & $sR[1] & ' -crcignore -sure -rb', "", 0)
                                        Exit
                                        EndIf
                                EndIf
        EndIf
EndFunc   ;==>_CQHF

评分

参与人数 1金钱 +10 收起 理由
afan + 10 感谢主动将修改帖子分类为[已解决],请继续 ...

查看全部评分

 楼主| 发表于 2010-5-12 17:54:58 | 显示全部楼层
没人吗?好吧,偶继续潜水努力去!
发表于 2010-5-12 17:59:37 | 显示全部楼层
可以用DSPTW.exe获取活动分区
 楼主| 发表于 2010-5-12 18:15:03 | 显示全部楼层
本帖最后由 sunkiss 于 2010-5-12 18:18 编辑

版主,一下是我在坛子里找到的,但是我真的看不懂,我不想做拿来主义,我要做的是读懂,看懂,会用,下次争取自己写啊!麻烦您老人家给我解释一下吧!好不好?
偶刚刚上手这个,以前看天空论坛里用的都是Au3,我也就闲着没事注册了一个账号,这几天发现au3真好啊!正想学习啊!帮帮新手吧
到9行我都能看懂,第10行为什么赋值是3呢?
#include <process.au3>
#include <file.au3>
Dim $file1,$active,$i,$str
FileInstall("dsptw.exe",@ScriptDir & "\dsptw.exe",1)
_rundos( @ScriptDir & "\dsptw.exe /A /PDR > " & @TempDir & "\partinfo.txt")
$file1=FileOpen(@TempDir & "\partinfo.txt",0)
If $file1=-1 Then MsgBox(16,"错误","不能读取数据文件!")
$i=3
$str=FileReadLine($file1,$i)
Do
   $active=StringMid($str,9,1)
   If $active="A" Then ExitLoop
   $i=$i+1
   $str=FileReadLine($file1,$i)
   Until @error=-1
   
If $active<>"A" Then
MsgBox(48,"活动分区","当前机器硬盘没有活动分区!")
Else
msgbox(64,"活动分区","当前机器硬盘活动分区为" & StringLeft($str,2) & " ")
EndIf
 楼主| 发表于 2010-5-12 18:16:30 | 显示全部楼层
http://www.cn-dos.net/forum/forum.php?mod=viewthread&tid=47793
看dos之家的批处理真的很简洁。但是成了au3可能我就看不懂了
发表于 2010-5-12 19:03:47 | 显示全部楼层
# $str=FileReadLine($file1,$i) ;读取file1的第$i行
# Do
#    $active=StringMid($str,9,1);从第$i行的第9个字符开始读取1个字符
#    If $active="A" Then ExitLoop ;如果该字符为A退出循环
#    $i=$i+1 ;循环变量加1
#    $str=FileReadLine($file1,$i)
#    Until @error=-1 ;出现错误时退出循环
发表于 2010-5-12 20:09:19 | 显示全部楼层
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])
$sR = StringRegExp($str, '([C-Z]:)\t(\d:\d+)', 3) ;正则匹配所有分区及位置
If Not @error Then MsgBox(0, 0, '最后分区 ' & $sR[UBound($sR) - 2] & ' No. ' & $sR[UBound($sR) - 1])
FileDelete(@TempDir & '\dsptw.exe') ;删除临时文件
FileDelete(@TempDir & '\diskinfo.txt') ;删除临时文件

本帖子中包含更多资源

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

×
 楼主| 发表于 2010-5-13 08:02:42 | 显示全部楼层
# $str=FileReadLine($file1,$i) ;读取file1的第$i行
# Do
#    $active=StringMid($str,9,1);从第$i行 ...
netegg 发表于 2010-5-12 19:03


谢谢您的注释了,我正在努力中
 楼主| 发表于 2010-5-13 08:44:18 | 显示全部楼层
本帖最后由 sunkiss 于 2010-5-13 08:54 编辑

回复 7# afan
afan版版,你的代码太强大了,大体明白意思了,可是还是不能理解!
$sR = StringRegExp($str, '([C-Z]:)\t\d:\d+\h*\tA\t', 3) ;正则匹配活动分区

这里面的([C-Z]:)是匹配从C到Z然后跟上:,\t匹配一个制表符、\d应该是匹配一个数字字符可是\d:是什么意思呢,没搞懂!+号和*号也明白是匹配前面的子表达式零次或多次和匹配前面的子表达式一次或多次,那个\h不懂,\tA是不是说匹配制表符中的大写字母A?最后的3是不是偏移量?是不是这样只是把前三列的数据以数组的形势处理?哎!还是没天分啊!只能这样请教老师了!
$sR = StringRegExp($str, '([C-Z]:)\t(\d:\d+)', 3) ;正则匹配所有分区及位置
下面这个也不懂

我想If Not @error Then MsgBox(0, 0, '活动分区 ' & $sR[0]) 后面也加上no.下面的1:1请让我我自己写,然后请你们帮忙指点好不好?当前的问题是不能理解正则表达式!

我的分区列表
Drive   No.     Active  VolumeLabe      Total (Mb)     Free (Mb)
C:        1:1         A                                49010          32363  
D:        1:3                                          100006         10549  
E:        1:4                                          105230         31559  
F:        1:2                                          980            201    
I:        2:3                                          102400         71459  
J:        2:4                                          317989         57181  
版版啊!我没能理解但是我的山寨技术太强了,我成功了,照着葫芦画瓢!

$sR = StringRegExp($str, '([C-Z]:)\t(\d:\d+)\h*\tA\t', 3) ;和下边那个一样加个()
If Not @error Then MsgBox(0, 0, '活动分区 ' & $sR[0] & ' No. ' & $sR[UBound($sR) - 1]);这样就有1:1了,我不懂!郁闷
发表于 2010-5-13 09:08:02 | 显示全部楼层
回复 9# sunkiss


    成功了就OK了~
\d:就是一个数字后面跟个":"而已;\h代表水平空格;\tA代表Tab空格后面跟个大写的"A";3是匹配标志,返回全局匹配数组~
 楼主| 发表于 2010-5-13 09:45:12 | 显示全部楼层
本帖最后由 sunkiss 于 2010-5-13 10:01 编辑

上面的代码还没理解又有新问题了!EnvSet设置的环境变量不能存到系统里,任何时候都调用!我用着个PECMD.EXE ,因为实在PE下用这个设的环境变量就可以任何时候用!但是我这样操作以后变量前边都有个"这个符号郁闷,把变量存到文件里再用FileReadLine能行吧!
local $CP = $sR[0]
local $HAO = $sR[UBound($sR) - 1]
RunWait(@ComSpec & ' /c ' & @TempDir & '\PECMD.EXE ENVI $CP="'&$CP&'"',"", @SW_HIDE)

我又失败了!哎!
$filea = FileOpen("123.txt", 10)
FileWrite($filea, "$sR[0]")
FileClose($filea)
123.txt里面只有$sR[0]看了看说明郁闷了,怎么把这个变量的值写进去呢?
发表于 2010-5-13 09:52:48 | 显示全部楼层
不懂。 我这也没PE环境~
在PE下运行这句显示什么?
Msgbox(0, 0, @ComSpec)
 楼主| 发表于 2010-5-13 10:05:39 | 显示全部楼层
我就是想吧$CP和$HAO设置为系统环境变量
local $CP = $sR[0]
local $HAO = $sR[UBound($sR) - 1]
 楼主| 发表于 2010-5-13 10:08:05 | 显示全部楼层
不懂。 我这也没PE环境~
在PE下运行这句显示什么?
Msgbox(0, 0, @ComSpec)
afan 发表于 2010-5-13 09:52


X:\WINS\system32\cmd.exe
发表于 2010-5-13 10:11:34 | 显示全部楼层
变量外面不要用"","$sR[0]" 不对,应该为 $sR[0]
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-12-27 13:15 , Processed in 0.084318 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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