顽固不化 发表于 2010-1-21 12:06:59

如何接收命令行的7z解压进度?

本帖最后由 顽固不化 于 2010-1-21 22:10 编辑

有7z命令行下的解压,每解压一个文件,屏幕上会显示一行信息,我用DOS的回显接收时,每次都接收整屏数据,也就是必须等到7Z解压完成才能得到数据,有没有能显示一行接收一行的方法?
记得jujumao的某高手做的驱动解压程序在解压7z时能实时显示解压状态。不知怎么做到的。

C.L 发表于 2010-1-21 13:11:12

看看这个能不能实现你的要求:
#include <ButtonConstants.au3>
#include <Constants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiIPAddress.au3>

$Form1 = GUICreate("dos回显", 330, 250)
$IPAddress = _GUICtrlIpAddress_Create($Form1, 70, 3, 120, 16)
_GUICtrlIpAddress_Set($IPAddress, "127.0.0.1")
GUICtrlCreateLabel("IP地址:", 5, 4, 46, 17)
$Ping = GUICtrlCreateButton("Ping", 250, 2, 65, 18, 0)
$Edit = GUICtrlCreateEdit("", 0, 24, 330, 220)
GUISetState(@SW_SHOW)

While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $Ping
                        _Ping()
        EndSwitch
WEnd

Func _Ping()
        GUICtrlSetState($edit,$gui_disable)
    $Result = Run(@ComSpec &" /c ping "&_GUICtrlIpAddress_Get($IPAddress)&" -n 10", "", @SW_HIDE, $STDOUT_CHILD)
    While 1
                $Line = StdoutRead($Result)
      If @error Then ExitLoop
      GUICtrlSetData($Edit, $Line, -1)
    WEnd
        GUICtrlSetState($edit,$gui_enable)
EndFunc

ndyndy 发表于 2010-1-21 13:12:24

哈哈,老革命碰到新问题。我也想知道

afan 发表于 2010-1-21 13:27:38

这个我也只是 ping 时才一行行显示……

顽固不化 发表于 2010-1-21 13:43:16

这是一段7z解压的测试代码,检测到整个屏幕的数据只读了一次。#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 600,600, -1, -1)
$Label1 = GUICtrlCreateEdit("Label1", 20, 20, 560,560)
GUISetState(@SW_SHOW)
$Runhd=Run("7z x 1.7z -y -oc:\1234",@ScriptDir, @SW_HIDE, $STDOUT_CHILD)
$n=0
While 1
   $line=StdoutRead($Runhd)
    If @error Then ExitLoop
   If $line<>"" Then
                $n+=1
                GUICtrlSetData($Label1,$line,-1)
        EndIf
Wend
MsgBox(0,0,$n)

lchl0588 发表于 2010-1-21 13:47:02

是不是跟这个差不多?

supersp 发表于 2010-1-21 14:04:25

使用ping可以是因为ping显示每一行都有很大的延迟...
或者,可以尝试直接读取7z的stdout,而不是cmd的stdout。

顽固不化 发表于 2010-1-21 14:39:45

是不是跟这个差不多?
lchl0588 发表于 2010-1-21 13:47 http://www.autoitx.com/images/common/back.gif


有点沾边的东西

afan 发表于 2010-1-21 14:53:27

AdlibRegister() 监视 FileExists() 然后模拟输出,呵呵

顽固不化 发表于 2010-1-21 15:04:40

AdlibRegister() 监视 FileExists() 然后模拟输出,呵呵
afan 发表于 2010-1-21 14:53 http://www.autoitx.com/images/common/back.gif

问题是模拟监视也要读屏幕信息的。除非有更好的办法获取到7Z的解压进度。
也想过监视文件量的变化,可是行不通的,比如这个文件夹里本来就有同名的文件,7z解压只是一次覆盖。
我要做的软件的其他技术问题均已解决,现在就是解压中设置解压进度条的值。难倒我了。

supersp 发表于 2010-1-21 16:33:05

咳.. 我还以为..
那么试试 run(@compc 7z)
通过 cmd 调用7z 呢?

lxz 发表于 2010-1-21 16:44:40

老革命碰到新问题。

nxbigdaddy 发表于 2010-1-21 18:08:40

楼主加油啊!!!

llztt 发表于 2010-1-21 18:53:59

如果要效仿2楼的办法的话,建议在WHILE循环里加以个sleep(500),设置一个记载上次STDOUT数据的变量,每次循环,把本次STDOUT数据被上次的STDOUT数据替换为空,然后控件显示新的数据,这样不闪屏;没必要0秒刷新,浪费CPU资源。。setdata时,可以直接全部setdata到EDIT,或者解析出每一行进行LISTVIEW。。。这个检测最好不用WHILE而用AdlibRegister来做,不占主循环。。

7Z的命令行,有个参数-so: write data to stdout,没查到怎么使用,怀疑可以用来屏显,不知可利用否?

sxltme 发表于 2010-1-21 19:00:09

LZ试试    监视下解压文件到---的文件夹的--文件变化
页: [1] 2 3
查看完整版本: 如何接收命令行的7z解压进度?