【已解决】关于CMD 回显输出的问题
本帖最后由 itzyx 于 2021-2-19 10:09 编辑CMD 回显输出,搜索了论坛的相关问题,查到可以通过下面代码,显示CMD 输出的内容#include <Constants.au3>
local $IP=InputBox('测试','请输入测试的IP'')
$foo = Run(@ComSpec & " /C PING " & $IP , @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
ProcessWaitClose($foo)
$text=StdoutRead($foo)
MsgBox(0, "STDOUT read:", $text)但是我现在要输入“telnet 192.168.8.xx”(物品ip),回车,输入用户名root,再输入其他的指令,通过读取CMD输出的结果,判断网络连接问题,用上面的方法好像没奏效,希望各位大佬能帮忙指点一下,万分感谢#include <Constants.au3>
Opt("MustDeclareVars",1)
local $IP=InputBox('测试','请输入测试物品的IP','192.168.8.xx')
_test()
Func _test()
Local $foo,$line
$foo=Run(@ComSpec & " /C telnet " & $IP,'', @SW_SHOW, $STDOUT_CHILD)
WinActivate('Telnet'&Chr(32)&$IP)
Sleep(500)
ControlSend('Telnet'&Chr(32)&$IP,'','','root')
Send('{Enter 3}')
ControlSend('Telnet'&Chr(32)&$IP,'','','xxxx')
Send('{Enter}')
itzyx 发表于 2021-2-6 16:50
好的,我再看看帮助文件,找找办法,谢谢A大
以下是经过反复测试、编写后最完善的代码,可应对各种情况:
Func RunCmd($sCommand, $bBin = False, $bWait = False) ;1:命令行 2:是否以二进制方式读取(防止中文乱码) 3:是否等待进程执行完毕(防止部分exe数据流获取不全,如Diskpart)
If $bBin = True Then
Local $sOutput = Binary('')
Else
Local $sOutput = ''
EndIf
Local $iPID = __Run($sCommand, '', @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
If $bWait Then
ProcessWaitClose($iPID)
$sOutput = StdoutRead($iPID, False, $bBin)
Else
While 1
$sOutput &= StdoutRead($iPID, False, $bBin)
If @error Then ExitLoop
WEnd
EndIf
If $bBin Then $sOutput = BinaryToString($sOutput, 4)
Return $sOutput
EndFunc ;==>RunCmd
Opt("TCPTimeout", 1000)
Global $socket, $host = "192.168.1.1", $port = 23
TCPStartup()
OnAutoItExitRegister("_exit")
$socket = TCPConnect($host, $port)
If @error Then Exit MsgBox(0, "", "连接失败")
_telnet("", "login")
_telnet("root", "password")
_telnet("admin", "#")
MsgBox(0, "", _telnet("ls /", "#"))
Func _telnet($command, $waitforstr = "", $retry = 10)
ConsoleWrite(@HOUR & ":" & @MIN & ":" & @SEC & ">>" & @CRLF & $command & @CRLF)
TCPSend($socket, $command & @CRLF)
Local $msg = "", $i = 0
Do
Sleep(100)
$tmp = TCPRecv($socket, 1024)
ConsoleWrite(@HOUR & ":" & @MIN & ":" & @SEC & "<<" & @CRLF & $tmp & @CRLF)
$msg &= $tmp & @CRLF
If $waitforstr = "" Or StringInStr($tmp, $waitforstr) Then ExitLoop
If $tmp = "" Then $i += 1
Until $i >= $retry
Return SetError($i >= $retry ? 1 : 0, 0, $msg)
EndFunc ;==>_telnet
Func _exit()
TCPCloseSocket($socket)
TCPShutdown()
EndFunc ;==>_exit
你搜索一下 回显。论坛有例子绝对你可以用. netmaple 发表于 2021-2-4 17:27
你搜索一下 回显。论坛有例子绝对你可以用.
好,我每次都会先查一下已经提过的问题,但是看了 几个方法好像都不太奏效,我先研究一下,谢谢解答 你代码中没有读取数据流啊,能显示啥东西
StdoutRead skysmile 发表于 2021-2-5 09:21
你代码中没有读取数据流啊,能显示啥东西
StdoutRead
上传的问题 ,不知道为啥漏了一部分 While 1
$line = StdoutRead($foo)
If @error Then ExitLoop
MsgBox(0,"test",$line )
Wend
EndFunc
这是后面读取的代码 既然是通过流操作,你这样send应该不行… 操作流,你有读取标志 $STDERR_CHILD + $STDOUT_CHILD,但写入必须要有 $STDIN_CHILD 标志
可以看看帮助文档关键字 StdinWrite
afan 发表于 2021-2-5 10:19
既然是通过流操作,你这样send应该不行… 操作流,你有读取标志 $STDERR_CHILD + $STDOUT_CHILD,但写入必 ...
好的 谢A大指点 https://www.autoitx.com/thread-44194-1-1.html
这个是Dos回显UDF应该能帮到你 netmaple 发表于 2021-2-5 14:47
https://www.autoitx.com/thread-44194-1-1.html
这个是Dos回显UDF应该能帮到你
好的 感谢解答 afan 发表于 2021-2-5 10:19
既然是通过流操作,你这样send应该不行… 操作流,你有读取标志 $STDERR_CHILD + $STDOUT_CHILD,但写入必 ...
A大 我搜了论坛之前的提问,看你回复过别的帖子 “貌似 telnet 不支持回显,想别的办法吧”, 现在有办法解决了嘛? 这个StdinWrite写入字符到运行的子进程,好像也不能读取显示的结果啊 itzyx 发表于 2021-2-6 15:38
A大 我搜了论坛之前的提问,看你回复过别的帖子 “貌似 telnet 不支持回显,想别的办法吧”, 现在有办法 ...
我回复的只是针对你的与流的交互,告诉你的查看帮助文档也有完整的输入与读取(所谓的回显)过程。至于run什么,没有兴趣。 afan 发表于 2021-2-6 16:35
我回复的只是针对你的与流的交互,告诉你的查看帮助文档也有完整的输入与读取(所谓的回显)过程。至于run ...
好的,我再看看帮助文件,找找办法,谢谢A大 telnet可以直接通过tcp操作,用cmd不合适。 zch11230 发表于 2021-2-7 15:21
telnet可以直接通过tcp操作,用cmd不合适。
额 大佬,TCP是怎么操作的,还没接触过,能否指点一二,万分感谢
页:
[1]
2