VB6 执行bat文件时 无法将dos显示结果 输出到txt文本

alfred2638923 2011-10-27 05:15:05
如题! 哪位大侠帮我看看下面的代码啊,调用bat的时候无法输出内容到txt,提示下标越界


Call GetResFile(101, "C:\Windows\System32\backup.bat", "bat", "C:\Windows\System32\backup.txt")
Call ToTextBox("C:\Windows\System32\backup.txt")

这两句话分开执行就可以,大侠帮忙看看吧,第一次写vb


我分不多,先给20分,等挣够分了,继续给!!!!!!!!!!!!跪谢啦!!!!!!!

Public Function GetResFile(ByVal ResID As Long, ByVal FileName As String, Types As String, TextName As String)
Dim bFile() As Byte, lFileLen As Double, bTmp() As Byte
Dim I As Long
Const lBlockLen As Long = 1048576 '默认一次1M长度


bFile = LoadResData(ResID, "CUSTOM") '将自定义资源中资源读入数组
lFileLen = UBound(bFile) + 1 '自定义资源的字节数

If Dir(FileName) = "" Then '只有文件存在时,才释放
Open FileName For Binary As #1
Do
If I + lBlockLen < lFileLen Then
ReDim bTmp(lBlockLen - 1)
Call CopyMemory(VarPtr(bTmp(0)), VarPtr(bFile(I)), lBlockLen)
I = I + lBlockLen
Put #1, , bTmp()
Else
ReDim bTmp(UBound(bFile) - I - 1)
Call CopyMemory(VarPtr(bTmp(0)), VarPtr(bFile(I)), lFileLen - 1 - I)
Put #1, , bTmp()
End If
Rem Debug.Print (Seek(1) / lFileLen#) * 100# & "%" '输出进度
DoEvents
Loop While Seek(1) < lFileLen
Close #1
End If

If Types = "exe" Then
Call Shell(FileName, vbNormalFocus)
Else
Shell "cmd /c " + FileName + " > " + TextName, vbHide Rem Call Shell("cmd /c del " + FileName, vbHide)
End If
End Function





Private Sub Command1_Click()
Call GetResFile(101, "C:\Windows\System32\backup.bat", "bat", "C:\Windows\System32\backup.txt")
Call ToTextBox("C:\Windows\System32\backup.txt")
Command1.Enabled = False
End Sub
...全文
520 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
王二.麻子 2011-11-01
  • 打赏
  • 举报
回复
LZ=猪
alfred2638923 2011-10-28
  • 打赏
  • 举报
回复
哪位高手再帮忙看看,我又更新了下代码,如下:


为什么执行的bat 批处理文件就无法写入 txt 中呢????我非常的费解啊
因为文件是空的,所以读取就提示 下标越界,哎,非常恼火


Public Function GetResFile(ResID As Long, FileName As String, Types As String, TextName As String)
Dim bFile() As Byte, lFileLen As Double, bTmp() As Byte
Dim I As Long
Const lBlockLen As Long = 1048576 '默认一次1M长度
Dim TempFile As Long
Dim loadBytes() As Byte


bFile = LoadResData(ResID, "CUSTOM") '将自定义资源中资源读入数组
lFileLen = UBound(bFile) + 1 '自定义资源的字节数

If Dir(FileName) = "" Then '只有文件存在时,才释放
Open FileName For Binary As #1
Do
If I + lBlockLen < lFileLen Then
ReDim bTmp(lBlockLen - 1)
Call CopyMemory(VarPtr(bTmp(0)), VarPtr(bFile(I)), lBlockLen)
I = I + lBlockLen
Put #1, , bTmp()
Else
ReDim bTmp(UBound(bFile) - I - 1)
Call CopyMemory(VarPtr(bTmp(0)), VarPtr(bFile(I)), lFileLen - 1 - I)
Put #1, , bTmp()
End If
Rem Debug.Print (Seek(1) / lFileLen#) * 100# & "%" '输出进度
DoEvents
Loop While Seek(1) < lFileLen
Close #1
End If

If Types = "exe" Then
Call Shell(FileName, vbNormalFocus)
Else
Shell "cmd /c " + FileName + " > " + TextName, vbHide
TempFile = FreeFile
Open TextName For Binary As #TempFile
ReDim loadBytes(1 To LOF(TempFile)) As Byte
Get #TempFile, , loadBytes
Close TempFile
Text1.Text = StrConv(loadBytes, vbUnicode)
End If
End Function



Private Sub Command1_Click()
Call GetResFile(101, "C:\Windows\System32\backup.bat", "bat", "C:\Windows\System32\backup.txt")
Command1.Enabled = False
End Sub
alfred2638923 2011-10-28
  • 打赏
  • 举报
回复



我现在的关键就是 这个问题“你没产生重定向的结果文件,是因为你的bat文件因为赋值写文件问题,是个空文件.空文件没dos命令,自然没输出.



为什么文件是空的,没有输入进内容呢?

王二.麻子 2011-10-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 spt_petrolor 的回复:]
http://topic.csdn.net/u/20110425/15/f011126a-6782-45bf-a9a3-bc7db1f00b6e.html

看那个链接

Call CopyMemory(bTmp(0), bFile(I), lFileLen - 1 - I)
这样调用就OK啦...

因为从APILoad搞来的CopyMemory的申明是:
Private Dec……
[/Quote]

说了你是Call CopyMemory()错了,你到是改什么了呀...

F8单步运行,在bTmp和bFile上点右键,点监视...在copymemory前后注意值的变化.

不是什么多难的调试.一定,必须,要学会单步,跟踪,不能跟踪的就把结果输出的文件,或者输出到调试信息
a397710978 2011-10-28
  • 打赏
  • 举报
回复
真长见识了
王二.麻子 2011-10-27
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20110425/15/f011126a-6782-45bf-a9a3-bc7db1f00b6e.html

看那个链接

Call CopyMemory(bTmp(0), bFile(I), lFileLen - 1 - I)
这样调用就OK啦...

因为从APILoad搞来的CopyMemory的申明是:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)

就是说用的是默认的byref,不需要Varptr了.

你没产生重定向的结果文件,是因为你的bat文件因为赋值写文件问题,是个空文件.空文件没dos命令,自然没输出.

另外不需要用那么复杂的赋值,写文件...从资源读取后直接写文件就OK


bFile = LoadResData(101, "CUSTOM")
Open "c:\x.bat" For Binary As #1
Put #1, , bFile

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧