如何接收命令行的7z解压进度?
本帖最后由 顽固不化 于 2010-1-21 22:10 编辑有7z命令行下的解压,每解压一个文件,屏幕上会显示一行信息,我用DOS的回显接收时,每次都接收整屏数据,也就是必须等到7Z解压完成才能得到数据,有没有能显示一行接收一行的方法?
记得jujumao的某高手做的驱动解压程序在解压7z时能实时显示解压状态。不知怎么做到的。 看看这个能不能实现你的要求:
#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
哈哈,老革命碰到新问题。我也想知道 这个我也只是 ping 时才一行行显示…… 这是一段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) 是不是跟这个差不多?
使用ping可以是因为ping显示每一行都有很大的延迟...
或者,可以尝试直接读取7z的stdout,而不是cmd的stdout。 是不是跟这个差不多?
lchl0588 发表于 2010-1-21 13:47 http://www.autoitx.com/images/common/back.gif
有点沾边的东西 AdlibRegister() 监视 FileExists() 然后模拟输出,呵呵 AdlibRegister() 监视 FileExists() 然后模拟输出,呵呵
afan 发表于 2010-1-21 14:53 http://www.autoitx.com/images/common/back.gif
问题是模拟监视也要读屏幕信息的。除非有更好的办法获取到7Z的解压进度。
也想过监视文件量的变化,可是行不通的,比如这个文件夹里本来就有同名的文件,7z解压只是一次覆盖。
我要做的软件的其他技术问题均已解决,现在就是解压中设置解压进度条的值。难倒我了。 咳.. 我还以为..
那么试试 run(@compc 7z)
通过 cmd 调用7z 呢? 老革命碰到新问题。 楼主加油啊!!! 如果要效仿2楼的办法的话,建议在WHILE循环里加以个sleep(500),设置一个记载上次STDOUT数据的变量,每次循环,把本次STDOUT数据被上次的STDOUT数据替换为空,然后控件显示新的数据,这样不闪屏;没必要0秒刷新,浪费CPU资源。。setdata时,可以直接全部setdata到EDIT,或者解析出每一行进行LISTVIEW。。。这个检测最好不用WHILE而用AdlibRegister来做,不占主循环。。
7Z的命令行,有个参数-so: write data to stdout,没查到怎么使用,怀疑可以用来屏显,不知可利用否? LZ试试 监视下解压文件到---的文件夹的--文件变化