itzyx 发表于 2021-2-4 15:17:02

【已解决】关于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}')



itsky2 发表于 2021-2-11 13:35:25

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

zch11230 发表于 2021-2-8 12:56:34

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:39

你搜索一下 回显。论坛有例子绝对你可以用.

itzyx 发表于 2021-2-5 09:16:53

netmaple 发表于 2021-2-4 17:27
你搜索一下 回显。论坛有例子绝对你可以用.

好,我每次都会先查一下已经提过的问题,但是看了 几个方法好像都不太奏效,我先研究一下,谢谢解答

skysmile 发表于 2021-2-5 09:21:34

你代码中没有读取数据流啊,能显示啥东西
StdoutRead

itzyx 发表于 2021-2-5 10:11:25

skysmile 发表于 2021-2-5 09:21
你代码中没有读取数据流啊,能显示啥东西
StdoutRead

上传的问题 ,不知道为啥漏了一部分 While 1
    $line = StdoutRead($foo)
    If @error Then ExitLoop
        MsgBox(0,"test",$line )
Wend
EndFunc

这是后面读取的代码

afan 发表于 2021-2-5 10:19:16

既然是通过流操作,你这样send应该不行… 操作流,你有读取标志 $STDERR_CHILD + $STDOUT_CHILD,但写入必须要有 $STDIN_CHILD 标志
可以看看帮助文档关键字 StdinWrite

itzyx 发表于 2021-2-5 10:43:56

afan 发表于 2021-2-5 10:19
既然是通过流操作,你这样send应该不行… 操作流,你有读取标志 $STDERR_CHILD + $STDOUT_CHILD,但写入必 ...

好的 谢A大指点

netmaple 发表于 2021-2-5 14:47:58

https://www.autoitx.com/thread-44194-1-1.html
这个是Dos回显UDF应该能帮到你

itzyx 发表于 2021-2-5 15:20:41

netmaple 发表于 2021-2-5 14:47
https://www.autoitx.com/thread-44194-1-1.html
这个是Dos回显UDF应该能帮到你

好的   感谢解答

itzyx 发表于 2021-2-6 15:38:11

afan 发表于 2021-2-5 10:19
既然是通过流操作,你这样send应该不行… 操作流,你有读取标志 $STDERR_CHILD + $STDOUT_CHILD,但写入必 ...

A大 我搜了论坛之前的提问,看你回复过别的帖子 “貌似 telnet 不支持回显,想别的办法吧”, 现在有办法解决了嘛? 这个StdinWrite写入字符到运行的子进程,好像也不能读取显示的结果啊

afan 发表于 2021-2-6 16:35:55

itzyx 发表于 2021-2-6 15:38
A大 我搜了论坛之前的提问,看你回复过别的帖子 “貌似 telnet 不支持回显,想别的办法吧”, 现在有办法 ...

我回复的只是针对你的与流的交互,告诉你的查看帮助文档也有完整的输入与读取(所谓的回显)过程。至于run什么,没有兴趣。

itzyx 发表于 2021-2-6 16:50:50

afan 发表于 2021-2-6 16:35
我回复的只是针对你的与流的交互,告诉你的查看帮助文档也有完整的输入与读取(所谓的回显)过程。至于run ...

好的,我再看看帮助文件,找找办法,谢谢A大

zch11230 发表于 2021-2-7 15:21:17

telnet可以直接通过tcp操作,用cmd不合适。

itzyx 发表于 2021-2-8 09:48:53

zch11230 发表于 2021-2-7 15:21
telnet可以直接通过tcp操作,用cmd不合适。

额 大佬,TCP是怎么操作的,还没接触过,能否指点一二,万分感谢
页: [1] 2
查看完整版本: 【已解决】关于CMD 回显输出的问题