找回密码
 加入
搜索
楼主: fuinei

[系统综合] [已解决]关于如何读取命令提示符窗口中的内容

 火.. [复制链接]
发表于 2011-9-26 15:08:02 | 显示全部楼层
telnet.exe 在 system32 目录下,是一个可执行文件。
StderrRead 好像不能用来读取 ShellExecute 的输出流吧?

如果不想用 TCP 方式,还有一种 workaround 也可以获取回显:
那就是超级终端的 Capture To Text 功能。
http://www.autoitscript.com/foru ... arch__1#entry490506
发表于 2011-9-26 15:19:08 | 显示全部楼层
说白了楼主的问题就是 如何获取现有CMD窗口内的内容,这个CMD窗口不是AutoIt自身进程调用Run函数创建的。
发表于 2011-9-26 15:26:36 | 显示全部楼层
怎么下不了附件
 楼主| 发表于 2011-9-26 16:36:28 | 显示全部楼层
飘云兄,telnet 192.168.1.1属命令,但使用Run(@ComSpec & " /c " & "telnet 192.168.1.1",  "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD + $STDIN_CHILD)还是返回空值
 楼主| 发表于 2011-9-26 16:42:00 | 显示全部楼层
使用Xiehuahere兄的示例代码可返回结果,基本可满足我的要求,但我希望在telnet后的窗口在实现操作,请问使用是否还是要在窗口上使用Send方式实现呢?
发表于 2011-9-26 21:27:43 | 显示全部楼层
本帖最后由 xiehuahere 于 2011-9-26 21:29 编辑

回复 20# fuinei


是的,重复 TCPSend(), Sleep(), TCPRecv() 操作即可。对接收到的内容要做判断,是否为预期的字符串(如命令提示符),才能知道上条命令是否执行成功。
在TCPRecv() 前sleep 是考虑到网络延时,一般300ms基本能够满足。
 楼主| 发表于 2011-9-27 08:29:49 | 显示全部楼层
请问TCPsend()可以过滤物理键盘的输入吗?
目前我使用telnet窗口+模拟按键+BlockinputEX函数限制输入的方式来实现我的telnet到路由器执行ping网关的操作,但效果不是非常好。
 楼主| 发表于 2011-9-27 10:29:17 | 显示全部楼层
使用TCPSend()函数后,TCPRev值为空,请问为什么呢?
 楼主| 发表于 2011-9-27 13:14:31 | 显示全部楼层
比较奇怪,使用TCPSend函数发送数据,TCPRecv收到的信息为TCPsend发送的信息
 楼主| 发表于 2011-9-27 13:24:53 | 显示全部楼层
请问TCPSend发送的数据中是否无法包括按键的呢?
 楼主| 发表于 2011-9-27 15:56:08 | 显示全部楼层
我需要实现登陆网络设备后执行ping操作,根据返回的结果判断通讯情况,如!!!!表示网络OK,如....表示网络不通,测试中发送TCPsend方式无法发送按键,而官网中的capture to text也未能实现记录,请问各位还有没有什么好的解决方法吗?TCPSend如果能发送按键或可以实现capture to text能记录ping的结果均可
发表于 2011-9-27 23:32:10 | 显示全部楼层
本帖最后由 xiehuahere 于 2011-9-27 23:38 编辑

无论是TCPsend方式还是官网中的capture to text都能实现记录,你没认真研究吧。
此类帖子也不少了,我点到为止。
TCPSend() 只发送你指定的命令,与键盘输入无关。
$delay = 300
$username = "root"
$passwd = ""
$cmd = "ping xx.xx.xx.xx"

TCPStartup()
$socket = TCPConnect($host, $port)
If $socket = -1 Then
        MsgBox(48, "Error", "Connect fail.")
        Exit
EndIf

Sleep(1000)
$ack = TCPRecv($socket, 500)

; verifying if the correct answer
If Not StringInStr($ack, "login") > 0 Then
                MsgBox(48, "Warning", "Wait for login request timeout!")
                Exit
EndIf

TCPSend($socket, $username & @CRLF)
Sleep($delay)
$ack = TCPRecv($socket, 80)
If Not StringInStr($ack, "Password") > 0 Then
                MsgBox(48, "Warning", "Wait for password request timeout!")
                Exit
EndIf

TCPSend($socket, $passwd & @CRLF)
Sleep($delay)
$ack = TCPRecv($socket, 80)
If Not StringInStr($ack, "# ") > 0 Then
                MsgBox(48, "Warning", "login failed!")
                Exit
EndIf

TCPSend($socket, $cmd & @CRLF)
Sleep(5000)
$ack = TCPRecv($socket, 300)
MsgBox(0, "", $ack)
最后通过msgbox看看ping命令返回的是什么吧,肯定是多行信息,而且有可能包含你发送的内容。
所以需要你做后续的字符串处理,可以用StringSplit() 将每行内容取出存入数组(分隔符指定为@CRLF,flag = 1),然后取出你要的那一行内容。
 楼主| 发表于 2011-9-29 13:22:10 | 显示全部楼层
问题已基本解决,非常感谢xiehuahere 兄的指导!
 楼主| 发表于 2011-10-10 23:39:07 | 显示全部楼层
使用TCPsend方式已成功获取回显结果,但目前遇到一个比较奇怪问题只要使用发送邮件(不管Jmail.dll还是cdonts.dll方式)+TCPshutdown()函数在其中一台测试的计算机执行后程序始终无法结束。
 楼主| 发表于 2011-10-23 13:01:48 | 显示全部楼层
程序的主要问题已解决,对于存在发送邮件便无法结束程序的问题没有深究已经换用其它计算机执行了.
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-16 12:22 , Processed in 0.071453 second(s), 13 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表