Board logo

标题: [问题求助] 已解决 VBS为什么wshshell的exec的writeline会阻拦进程? [打印本页]

作者: jyswjjgdwtdtj    时间: 2023-8-7 10:26     标题: 已解决 VBS为什么wshshell的exec的writeline会阻拦进程?

本帖最后由 jyswjjgdwtdtj 于 2023-8-11 17:12 编辑
  1. set w=createobject("wscript.shell")
  2. set a=w.exec("cmd")
  3. a.stdin.writeline "powershell -windowstyle hidden exit" ' 因为窗口被隐藏 可以知道这的确被执行了
  4. 'a.stdin.writeline "ftype"
  5. '一定得cmd窗口被关闭 才会执行下面的语句
  6. msgbox a.stdout.readall'cmd被关闭后 ftype的输出可以被正常获取
复制代码




事实证明 在exec中不可使用的是atendofstream和readall
作者: czjt1234    时间: 2023-8-7 11:13

a.stdin.close
作者: czjt1234    时间: 2023-8-7 11:19

  1. '示例:vbs读取批处理或cmd命令返回的字符串,隐藏黑框
  2. Set oWshShell = CreateObject("WScript.Shell")
  3. Set oFSO = CreateObject("Scripting.FileSystemObject")
  4. s = oWshShell.ExpandEnvironmentStrings("%windir%\System32\CScript.exe")
  5. If oFSO.FileExists(s) And LCase(WScript.FullName) <> LCase(s) Then
  6.     s = s & " """ & WScript.ScriptFullName & """ "
  7.     For Each i In WScript.Arguments
  8.         If InStr(i, " ") > 0 Then i = """" & i & """"
  9.         s = s & i & " "
  10.     Next
  11.     oWshShell.Run Left(s, Len(s) - 1), 0
  12.     WScript.Quit()
  13. End If
  14. Set oWshScriptExec = oWshShell.Exec("cmd.exe")
  15. With oWshScriptExec.StdIn
  16.     .WriteLine "@echo off & query user"
  17.     .Close()
  18. End With
  19. With oWshScriptExec.StdOut
  20.     s = .ReadAll()
  21.     .Close()
  22. End With
  23. MsgBox s
  24. Set oWshScriptExec = oWshShell.Exec("cmd.exe")
  25. With oWshScriptExec.StdIn
  26.     .WriteLine "@echo off & D:\test.bat"
  27.     .Close()
  28. End With
  29. With oWshScriptExec.StdOut
  30.     s = .ReadAll()
  31.     .Close()
  32. End With
  33. 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


自行测试,请
  1. set w=createobject("wscript.shell")
  2. set a=w.exec("cmd")
  3. a.stdin.writeline "powershell -windowstyle hidden exit" ' 因为窗口被隐藏 可以知道这的确被执行了
  4. a.stdin.writeline "ftype"
  5. a.stdin.writeline "exit"
  6. msgbox a.stdout.readall'cmd被关闭后 ftype的输出可以被正常获取
复制代码

作者: Five66    时间: 2023-8-9 19:25

试了一下,真的是readall的问题
  1. set w=createobject("wscript.shell")
  2. set a=w.exec("cmd")
  3. a.stdin.writeline "ftype"
  4. 'cmd窗口不关闭也会执行下面的语句
  5. msgbox a.stdout.readline
复制代码





欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2