找回密码
 加入
搜索
查看: 20370|回复: 41

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

 火... [复制链接]
发表于 2010-1-21 12:06:59 | 显示全部楼层 |阅读模式
本帖最后由 顽固不化 于 2010-1-21 22:10 编辑

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

评分

参与人数 1金钱 +10 收起 理由
pusofalse + 10 感谢主动修改帖子分类为[已解决]。

查看全部评分

发表于 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
 
发表于 2010-1-21 13:12:24 | 显示全部楼层
哈哈,老革命碰到新问题。我也想知道
发表于 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)

本帖子中包含更多资源

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

×
发表于 2010-1-21 13:47:02 | 显示全部楼层
是不是跟这个差不多?

本帖子中包含更多资源

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

×
发表于 2010-1-21 14:04:25 | 显示全部楼层
使用ping可以是因为ping显示每一行都有很大的延迟...
或者,可以尝试直接读取7z的stdout,而不是cmd的stdout。
 楼主| 发表于 2010-1-21 14:39:45 | 显示全部楼层
是不是跟这个差不多?
lchl0588 发表于 2010-1-21 13:47



  有点沾边的东西
发表于 2010-1-21 14:53:27 | 显示全部楼层
AdlibRegister() 监视 FileExists() 然后模拟输出,呵呵
 楼主| 发表于 2010-1-21 15:04:40 | 显示全部楼层
AdlibRegister() 监视 FileExists() 然后模拟输出,呵呵
afan 发表于 2010-1-21 14:53


问题是模拟监视也要读屏幕信息的。除非有更好的办法获取到7Z的解压进度。
也想过监视文件量的变化,可是行不通的,比如这个文件夹里本来就有同名的文件,7z解压只是一次覆盖。
我要做的软件的其他技术问题均已解决,现在就是解压中设置解压进度条的值。难倒我了。
发表于 2010-1-21 16:33:05 | 显示全部楼层
咳.. 我还以为..
那么试试 run(@compc 7z)
通过 cmd 调用7z 呢?
发表于 2010-1-21 16:44:40 | 显示全部楼层
老革命碰到新问题。
发表于 2010-1-21 18:08:40 | 显示全部楼层
楼主加油啊!!!
发表于 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,没查到怎么使用,怀疑可以用来屏显,不知可利用否?
发表于 2010-1-21 19:00:09 | 显示全部楼层
LZ试试    监视下解压文件到---的文件夹的--文件变化
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 22:19 , Processed in 0.078139 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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