sunkiss 发表于 2010-5-12 17:36:50

关于dsptw分区的bat转au3!【已经解决】

本帖最后由 sunkiss 于 2010-5-15 12:54 编辑

在网上找了个批处理,然后改了一下,在PE下用过能用不知道怎么改成AU3了,学些AU32天了,还是没学会!急着用没找到好办法,AU3有点难学,看来是没有速成的办法了!请高手帮忙吧!各位老大帮忙的时候别忘了给我这个菜鸟加上个注释啊!
这个批处理改的就是这个地址上看到的
http://hi.baidu.com/%C6%BD%B0%B2%CA%C7%B8%A3/blog/item/85f0a2ec40198d352797910f.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, '(:)\t(\d:\d+)\h*\tA\t', 3) ;正则匹配活动分区,[从C到Z]、\t匹配一个制表符、\d、匹配一个数字字符、:???
If Not @error Then MsgBox(0, 0, '活动分区 ' & $sR & ' No. ' & $sR)
RunWait(@ComSpec & ' /c ' & @TempDir & '\PECMD.EXE ENVI $CP='&$sR&'',"", @SW_HIDE)
RunWait(@ComSpec & ' /c ' & @TempDir & '\PECMD.EXE ENVI $HAO='&$sR&'',"", @SW_HIDE)
If Not @error Then MsgBox(0, 0, '活动分区 ' & $CP & ' No. ' & $HAO)
;$sR = StringRegExp($str, '(:)\t(\d:\d+)', 3) ;正则匹配所有分区及位置
;If Not @error Then MsgBox(0, 0, '最后分区 ' & $sR & ' No. ' & $sR)
;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
                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, '(:)\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 & '' & @CR & @CR & 'WINXPSP3.GHO的路径是:' & @CR & @CR & ''&$varrr[$i]&$gho&'')
                        Case $RS = "2:1"
                                $flag = MsgBox(1, "请确认当前系统分区的正确性", '本地活动磁盘的盘符是:' & $sR & '' & @CR & @CR & '对应的GHOST编号为:' & $sR & '')
                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 & ' -crcignore -sure -rb', "", 0)
                                        Exit
                                        EndIf
                                EndIf
        EndIf
EndFunc   ;==>_CQHF

sunkiss 发表于 2010-5-12 17:54:58

没人吗?好吧,偶继续潜水努力去!

afan 发表于 2010-5-12 17:59:37

可以用DSPTW.exe获取活动分区

sunkiss 发表于 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

sunkiss 发表于 2010-5-12 18:16:30

http://www.cn-dos.net/forum/forum.php?mod=viewthread&tid=47793看dos之家的批处理真的很简洁。但是成了au3可能我就看不懂了

netegg 发表于 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 ;出现错误时退出循环

afan 发表于 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, '(:)\t\d:\d+\h*\tA\t', 3) ;正则匹配活动分区
If Not @error Then MsgBox(0, 0, '活动分区 ' & $sR)
$sR = StringRegExp($str, '(:)\t(\d:\d+)', 3) ;正则匹配所有分区及位置
If Not @error Then MsgBox(0, 0, '最后分区 ' & $sR & ' No. ' & $sR)
FileDelete(@TempDir & '\dsptw.exe') ;删除临时文件
FileDelete(@TempDir & '\diskinfo.txt') ;删除临时文件

sunkiss 发表于 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 http://www.autoitx.com/images/common/back.gif

谢谢您的注释了,我正在努力中

sunkiss 发表于 2010-5-13 08:44:18

本帖最后由 sunkiss 于 2010-5-13 08:54 编辑

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

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

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

我的分区列表Drive   No.   ActiveVolumeLabe      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, '(:)\t(\d:\d+)\h*\tA\t', 3) ;和下边那个一样加个()
If Not @error Then MsgBox(0, 0, '活动分区 ' & $sR & ' No. ' & $sR);这样就有1:1了,我不懂!郁闷

afan 发表于 2010-5-13 09:08:02

回复 9# sunkiss


    成功了就OK了~
\d:就是一个数字后面跟个":"而已;\h代表水平空格;\tA代表Tab空格后面跟个大写的"A";3是匹配标志,返回全局匹配数组~

sunkiss 发表于 2010-5-13 09:45:12

本帖最后由 sunkiss 于 2010-5-13 10:01 编辑

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

我又失败了!哎!
$filea = FileOpen("123.txt", 10)
FileWrite($filea, "$sR")
FileClose($filea)
123.txt里面只有$sR看了看说明郁闷了,怎么把这个变量的值写进去呢?

afan 发表于 2010-5-13 09:52:48

不懂。 我这也没PE环境~
在PE下运行这句显示什么?
Msgbox(0, 0, @ComSpec)

sunkiss 发表于 2010-5-13 10:05:39

我就是想吧$CP和$HAO设置为系统环境变量
local $CP = $sR
local $HAO = $sR

sunkiss 发表于 2010-5-13 10:08:05

不懂。 我这也没PE环境~
在PE下运行这句显示什么?
Msgbox(0, 0, @ComSpec)
afan 发表于 2010-5-13 09:52 http://www.autoitx.com/images/common/back.gif

X:\WINS\system32\cmd.exe

afan 发表于 2010-5-13 10:11:34

变量外面不要用"","$sR" 不对,应该为 $sR
页: [1] 2 3 4
查看完整版本: 关于dsptw分区的bat转au3!【已经解决】