[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 已解决 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

a.stdin.close

QQ 20147578

TOP

  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
复制代码

QQ 20147578

TOP

回复 2# czjt1234


    那如果我还想继续输入呢?
获取一次再输入再获取一次

TOP

回复 4# jyswjjgdwtdtj


几个常用的对象都不支持这个功能

不知道别的对象可以不

QQ 20147578

TOP

难道不是msgbox的问题么?

TOP

回复 6# Five66

显然不是

TOP

有没有一种可能,readall的意思是读取所有
也就是换句话说,不会产生新的了
再换句话说,就是标准输出流关闭了
如果标准输出流没关闭,那就会一直阻塞,就这么简单
解决方法也很简单,read或者readline,然后用atendofline或者atendofstream
这些只要那边输出满足了要求就会结束阻塞返回,不会等待输出流关闭

TOP

回复 5# czjt1234


    不要轻易说不可能哦(

补充楼上,这块在各种语言中被称作“流”或者“迭代器”
vbs 可能没有太详细讲这块的,不过其它语言(比如java,c++,rust等都有很详细的教程)
想系统学习可以看其它语言的这部分的讲解
语言之间,很多东西都是相通的
1

评分人数

TOP

回复 8# 老刘1号


    啊?但是我是卡在msgbox前啊 writeline写入的东西执行了 然后卡住了 和readall应该没关系

TOP

回复 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的输出可以被正常获取
复制代码

TOP

试了一下,真的是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
复制代码

TOP

返回列表