标题: [问题求助] 已解决 VBS为什么wshshell的exec的writeline会阻拦进程? [打印本页]
作者: jyswjjgdwtdtj 时间: 2023-8-7 10:26 标题: 已解决 VBS为什么wshshell的exec的writeline会阻拦进程?
本帖最后由 jyswjjgdwtdtj 于 2023-8-11 17:12 编辑
- set w=createobject("wscript.shell")
- set a=w.exec("cmd")
- a.stdin.writeline "powershell -windowstyle hidden exit" ' 因为窗口被隐藏 可以知道这的确被执行了
- 'a.stdin.writeline "ftype"
- '一定得cmd窗口被关闭 才会执行下面的语句
- msgbox a.stdout.readall'cmd被关闭后 ftype的输出可以被正常获取
复制代码
事实证明 在exec中不可使用的是atendofstream和readall
作者: czjt1234 时间: 2023-8-7 11:13
a.stdin.close
作者: czjt1234 时间: 2023-8-7 11:19
- '示例:vbs读取批处理或cmd命令返回的字符串,隐藏黑框
- Set oWshShell = CreateObject("WScript.Shell")
- Set oFSO = CreateObject("Scripting.FileSystemObject")
- s = oWshShell.ExpandEnvironmentStrings("%windir%\System32\CScript.exe")
- If oFSO.FileExists(s) And LCase(WScript.FullName) <> LCase(s) Then
- s = s & " """ & WScript.ScriptFullName & """ "
- For Each i In WScript.Arguments
- If InStr(i, " ") > 0 Then i = """" & i & """"
- s = s & i & " "
- Next
- oWshShell.Run Left(s, Len(s) - 1), 0
- WScript.Quit()
- End If
-
- Set oWshScriptExec = oWshShell.Exec("cmd.exe")
- With oWshScriptExec.StdIn
- .WriteLine "@echo off & query user"
- .Close()
- End With
- With oWshScriptExec.StdOut
- s = .ReadAll()
- .Close()
- End With
- MsgBox s
-
- Set oWshScriptExec = oWshShell.Exec("cmd.exe")
- With oWshScriptExec.StdIn
- .WriteLine "@echo off & D:\test.bat"
- .Close()
- End With
- With oWshScriptExec.StdOut
- s = .ReadAll()
- .Close()
- End With
- MsgBox s
复制代码
作者: jyswjjgdwtdtj 时间: 2023-8-7 13:17
回复 2# czjt1234
那如果我还想继续输入呢?
获取一次再输入再获取一次
作者: czjt1234 时间: 2023-8-7 13:52
回复 4# jyswjjgdwtdtj
几个常用的对象都不支持这个功能
不知道别的对象可以不
作者: Five66 时间: 2023-8-7 17:57
难道不是msgbox的问题么?
作者: jyswjjgdwtdtj 时间: 2023-8-8 14:54
回复 6# Five66
显然不是
作者: 老刘1号 时间: 2023-8-8 21:51
有没有一种可能,readall的意思是读取所有
也就是换句话说,不会产生新的了
再换句话说,就是标准输出流关闭了
如果标准输出流没关闭,那就会一直阻塞,就这么简单
解决方法也很简单,read或者readline,然后用atendofline或者atendofstream
这些只要那边输出满足了要求就会结束阻塞返回,不会等待输出流关闭
作者: 老刘1号 时间: 2023-8-8 21:58
回复 5# czjt1234
不要轻易说不可能哦(
补充楼上,这块在各种语言中被称作“流”或者“迭代器”
vbs 可能没有太详细讲这块的,不过其它语言(比如java,c++,rust等都有很详细的教程)
想系统学习可以看其它语言的这部分的讲解
语言之间,很多东西都是相通的
作者: jyswjjgdwtdtj 时间: 2023-8-9 17:56
回复 8# 老刘1号
啊?但是我是卡在msgbox前啊 writeline写入的东西执行了 然后卡住了 和readall应该没关系
作者: 老刘1号 时间: 2023-8-9 19:02
回复 10# jyswjjgdwtdtj
自行测试,请- set w=createobject("wscript.shell")
- set a=w.exec("cmd")
- a.stdin.writeline "powershell -windowstyle hidden exit" ' 因为窗口被隐藏 可以知道这的确被执行了
- a.stdin.writeline "ftype"
- a.stdin.writeline "exit"
- msgbox a.stdout.readall'cmd被关闭后 ftype的输出可以被正常获取
复制代码
作者: Five66 时间: 2023-8-9 19:25
试了一下,真的是readall的问题- set w=createobject("wscript.shell")
- set a=w.exec("cmd")
- a.stdin.writeline "ftype"
- 'cmd窗口不关闭也会执行下面的语句
- msgbox a.stdout.readline
复制代码
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |