vbs 控制台应用sendkeys无效怎么办

fansmit 2014-11-12 08:34:37
我需要在一个控制台应用中模拟键盘输入选择选项
我先是用vbs调用cmd.exe 然后利用sendkeys输入路径 并在控制台窗口中打开我需要的控制台应用,应用也成功打开但是接下来的sendkeys完全无效 我使用appactivate 激活这个控制台应用也没法使sendkeys起作用,但用键盘就可以,有谁知道这是为什么吗,有什么解决方案没有,我没什么脚本基础, 还请高人指点,真不想用开发工具做这么简单的东西,谢谢
...全文
2883 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
N1CEyk 2016-07-01
  • 打赏
  • 举报
回复
我也遇到了同样的问题了,sendkey 对cmd无效呀,不知道你解决了没
cuisanzhang 2015-11-09
  • 打赏
  • 举报
回复
我估计这个EXEC 得强制用Cscript.exe执行:
fansmit 2014-11-18
  • 打赏
  • 举报
回复
。。。怎么会这样
fansmit 2014-11-17
  • 打赏
  • 举报
回复
2位朋友都没理解错 这个应用确实需要带参数 但是slwsss提供的set shellrun = CreateObject("WScript.Shell") shellrun.run "C:\a.exe -a.b" 我用了 是无效的 在命令行里它会提示我 Unable to open file 'a.b' 这个结果和我直接在命令行里输入C:\a.exe -a.b 是相同的错误提示 除非我把当前的路径切换到这个应用的路径下 在这里也就是c:\ 才能正常开启应用 也就是说C:\test>C:\a.exe -a.b 回车 会提示Unable to open file 'a.b' 但如果我先切换到C:\下 也就是C:\>a.exe -a.b,就运行正常 还有ccbccb的title testing代码 如果用在我的应用上 最后就会提示管道正在关闭
ccbccb 2014-11-17
  • 打赏
  • 举报
回复
引用 26 楼 Fansmit 的回复:
[quote=引用 24 楼 ccbccb 的回复:] 对了,那你试试 C:\test>C:\a.exe -C:\a.b或 C:\test>C:\a.exe -\a.b呢?
这个试了一下 貌似不行 ccbccb 能否给我个联系方式比如qq什么的 那样就可以直接和你联系了 这么一发一回的实在是费时间。。。[/quote] 现在发不了私信。
fansmit 2014-11-17
  • 打赏
  • 举报
回复
引用 24 楼 ccbccb 的回复:
对了,那你试试 C:\test>C:\a.exe -C:\a.b或 C:\test>C:\a.exe -\a.b呢?
这个试了一下 貌似不行 ccbccb 能否给我个联系方式比如qq什么的 那样就可以直接和你联系了 这么一发一回的实在是费时间。。。
fansmit 2014-11-17
  • 打赏
  • 举报
回复
我是遇到了2个问题 一个是带参数无法运行 一个是运行后不接受sendkeys 或 stdin方法的输入 这个应用是可以不带参数运行的 所以第二个问题我是没带参数做的 但实际上带不带参数这个应用都不接受输入
ccbccb 2014-11-17
  • 打赏
  • 举报
回复
对了,那你试试 C:\test>C:\a.exe -C:\a.b或 C:\test>C:\a.exe -\a.b呢?
ccbccb 2014-11-17
  • 打赏
  • 举报
回复
引用 22 楼 Fansmit 的回复:
2位朋友都没理解错 这个应用确实需要带参数 但是slwsss提供的set shellrun = CreateObject("WScript.Shell") shellrun.run "C:\a.exe -a.b" 我用了 是无效的 在命令行里它会提示我 Unable to open file 'a.b' 这个结果和我直接在命令行里输入C:\a.exe -a.b 是相同的错误提示 除非我把当前的路径切换到这个应用的路径下 在这里也就是c:\ 才能正常开启应用 也就是说C:\test>C:\a.exe -a.b 回车 会提示Unable to open file 'a.b' 但如果我先切换到C:\下 也就是C:\>a.exe -a.b,就运行正常 还有ccbccb的title testing代码 如果用在我的应用上 最后就会提示管道正在关闭
那这样的话就是说你的程序不接受stdin的输入吧。而且你的问题好像也和sendkeys之类的没什么关系吧。之所以要在特定的文件夹运行它,是因为它只在当前位置找文件,能正常的那个位置有这个文件,不正常的位置没那个文件,是不是这样的?搞了几天都还是没真正明白你想干什么。
ccbccb 2014-11-16
  • 打赏
  • 举报
回复
你原来调用程序是用shell的run方法吧,其实在VBS中要打开控制台程序并且还要输入,应该换另一种思路,用Shell的exec方法。 Exec 方法 请参阅 WshScriptExec 对象 语言 JScript VBScript 显示所有语言 在子命令外壳程序中运行应用程序,提供对 StdIn/StdOut/StdErr 流的访问。 object.Exec(strCommand) 参数 object WshShell 对象。 strCommand 表示用于运行脚本的命令行的字符串值。该命令行看上去和从命令提示符处键入完全一样。 说明 Exec 方法返回 WshScriptExec 对象,它提供有关用 Exec 运行的脚本状态和错误信息,还提供对 StdIn、StdOut 和 StdErr 频道的访问。Exec 方法只允许执行命令行应用程序。Exec 方法不能用于运行远程脚本。不要混淆 Exec 方法和 Execute 方法(后者属于 WshRemote 对象)。 试试这个是否有帮助。
fansmit 2014-11-16
  • 打赏
  • 举报
回复
另外这个应用关闭 最后会弹出“管道正在关闭”的错误提示 错误定位在最后输入a的那个行
fansmit 2014-11-16
  • 打赏
  • 举报
回复
引用 12 楼 ccbccb 的回复:
http://demon.tw/programming/vbs-run-and-exec.html 这个你可以看看,说得很详细。
我也是参考的你提供的链接内容做的 并且加了一下你提供的 测试运行状态的代码 但是启动这个应用后 之后的输入没有任何反应 关闭这个应用会弹出状态值为1, 我的代码如下
Set ws = WScript.CreateObject ("WSCript.shell")

cmd = "C:\a.exe"
//启动控制台应用
Set oExec = ws.Exec(cmd)

Do While oExec.Status = 0
     WScript.Sleep 100
Loop
 
WScript.Echo oExec.Status

wscript.sleep 3000
//在启动后的控制台应用中输入a选项(这个控制台里都是选项 输入a是为了模拟选择a项)
oexec.StdIn.WriteLine "a"
ccbccb 2014-11-16
  • 打赏
  • 举报
回复
引用 16 楼 Fansmit 的回复:
这个是我原始的方法 Set ws = WScript.CreateObject ("WSCript.shell") cmd = "C:\a.exe" //启动控制台应用 Set oExec = ws.Exec(cmd) wscript.sleep 3000 //在启动后的控制台应用中输入a选项(这个控制台里都是选项 输入a是为了模拟选择a项) oexec.StdIn.WriteLine "a" 这么些写也不行
另外还要注意writeline和write的区别
ccbccb 2014-11-16
  • 打赏
  • 举报
回复
引用 16 楼 Fansmit 的回复:
这个是我原始的方法 Set ws = WScript.CreateObject ("WSCript.shell") cmd = "C:\a.exe" //启动控制台应用 Set oExec = ws.Exec(cmd) wscript.sleep 3000 //在启动后的控制台应用中输入a选项(这个控制台里都是选项 输入a是为了模拟选择a项) oexec.StdIn.WriteLine "a" 这么些写也不行
给你一个简单的例子说明这种方法的可行性,在这个例子中我运行了cmd.exe,2秒后通过stdin输入title命令修改窗口的title,结果是成功的,可以看到效果。

Set WshShell = CreateObject("WScript.Shell")

Set oExec = WshShell.Exec("cmd.exe")
WScript.Sleep 2000
oExec.StdIn.WriteLine "title testing"
WScript.Sleep 10000
ccbccb 2014-11-16
  • 打赏
  • 举报
回复
引用 18 楼 slwsss 的回复:
[quote=引用 6 楼 Fansmit 的回复:] [quote=引用 4 楼 slwsss 的回复:] [quote=引用 3 楼 Fansmit 的回复:] 我的那个必须用cmd 因为需要用到参数调用 开程序已经无所谓了 问题是打开后的控制台应用没法通过sendkeys方法实现 我发现sendkeys方法也没法控制windows中的模拟键盘输入 我用c#的sendkey方法也不行 后来用User32.dll 的keybd_event也不行
开程序时就可以传入参数的[/quote] 请问应该如何用vbs启动带参数的控制台应用呢 比如我在命令行里正常输入是 C:\a.exe -a.b, 那在vbs中应该怎么写呢?谢谢![/quote] set shellrun = CreateObject("WScript.Shell") shellrun.run "C:\a.exe -a.b"[/quote] 你这个是假设他的程序支持命令行参数,我相信这个楼主肯定也懂的。他要的是向他的控制台程序输入,这是完全不同的问题。
slwsss 2014-11-16
  • 打赏
  • 举报
回复
引用 6 楼 Fansmit 的回复:
[quote=引用 4 楼 slwsss 的回复:] [quote=引用 3 楼 Fansmit 的回复:] 我的那个必须用cmd 因为需要用到参数调用 开程序已经无所谓了 问题是打开后的控制台应用没法通过sendkeys方法实现 我发现sendkeys方法也没法控制windows中的模拟键盘输入 我用c#的sendkey方法也不行 后来用User32.dll 的keybd_event也不行
开程序时就可以传入参数的[/quote] 请问应该如何用vbs启动带参数的控制台应用呢 比如我在命令行里正常输入是 C:\a.exe -a.b, 那在vbs中应该怎么写呢?谢谢![/quote] set shellrun = CreateObject("WScript.Shell") shellrun.run "C:\a.exe -a.b"
ccbccb 2014-11-16
  • 打赏
  • 举报
回复
引用 16 楼 Fansmit 的回复:
这个是我原始的方法 Set ws = WScript.CreateObject ("WSCript.shell") cmd = "C:\a.exe" //启动控制台应用 Set oExec = ws.Exec(cmd) wscript.sleep 3000 //在启动后的控制台应用中输入a选项(这个控制台里都是选项 输入a是为了模拟选择a项) oexec.StdIn.WriteLine "a" 这么些写也不行
由于exec方法控制了stdin, stdout等,所以控制台窗口是黑屏没显示的。所以黑屏不能说就是不行。如果按了键后会有相应的输出,你可以操作它的stdout或stderr看看它的输出是否符合预期或是否有其他的错误提示。
fansmit 2014-11-16
  • 打赏
  • 举报
回复
这个是我原始的方法
Set ws = WScript.CreateObject ("WSCript.shell")

cmd = "C:\a.exe"

//启动控制台应用

Set oExec = ws.Exec(cmd)

wscript.sleep 3000

//在启动后的控制台应用中输入a选项(这个控制台里都是选项 输入a是为了模拟选择a项)

oexec.StdIn.WriteLine "a"

这么些写也不行
ccbccb 2014-11-16
  • 打赏
  • 举报
回复
http://demon.tw/programming/vbs-run-and-exec.html 这个你可以看看,说得很详细。
ccbccb 2014-11-16
  • 打赏
  • 举报
回复
另外有没有测试调用的程序的运行状态? 看看 《Script全集》里面这个示例:
Dim WshShell, oExec
Set WshShell = CreateObject("WScript.Shell")

Set oExec = WshShell.Exec("calc")

Do While oExec.Status = 0
     WScript.Sleep 100
Loop

WScript.Echo oExec.Status
我以前为了用runas命令也研究过这个问题。exec确实是可以用的,但由于runas命令的特殊性,在输入密码时还是不成功。后来有找到一个别人写的runas的替代品,不用手工输入密码了,所以也没再研究了。
加载更多回复(10)

4,008

社区成员

发帖
与我相关
我的任务
社区描述
它是一种微软环境下的轻量级的解释型语言,它使用COM组件、WMI、WSH、ADSI访问系统中的元素,对系统进行管理。
社区管理员
  • vbScript社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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