找回密码
 加入
搜索
查看: 7055|回复: 16

[AU3基础] 【已解决】关于CMD 回显输出的问题

  [复制链接]
发表于 2021-2-4 15:17:02 | 显示全部楼层 |阅读模式
本帖最后由 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}')



发表于 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

评分

参与人数 1金钱 +30 收起 理由
itzyx + 30 很给力!

查看全部评分

发表于 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

评分

参与人数 1金钱 +30 收起 理由
itzyx + 30 赞一个! 我来好好琢磨琢磨

查看全部评分

发表于 2021-2-4 17:27:39 | 显示全部楼层
你搜索一下 回显。论坛有例子绝对你可以用.
 楼主| 发表于 2021-2-5 09:16:53 | 显示全部楼层
netmaple 发表于 2021-2-4 17:27
你搜索一下 回显。论坛有例子绝对你可以用.

好,我每次都会先查一下已经提过的问题,但是看了 几个方法好像都不太奏效,我先研究一下,谢谢解答
发表于 2021-2-5 09:21:34 | 显示全部楼层
你代码中没有读取数据流啊,能显示啥东西
StdoutRead
 楼主| 发表于 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

这是后面读取的代码
发表于 2021-2-5 10:19:16 | 显示全部楼层
既然是通过流操作,你这样send应该不行… 操作流,你有读取标志 $STDERR_CHILD + $STDOUT_CHILD,但写入必须要有 $STDIN_CHILD 标志
可以看看帮助文档关键字 StdinWrite
 楼主| 发表于 2021-2-5 10:43:56 | 显示全部楼层
afan 发表于 2021-2-5 10:19
既然是通过流操作,你这样send应该不行… 操作流,你有读取标志 $STDERR_CHILD + $STDOUT_CHILD,但写入必 ...

好的 谢A大指点
发表于 2021-2-5 14:47:58 | 显示全部楼层
https://www.autoitx.com/thread-44194-1-1.html
这个是Dos回显UDF应该能帮到你
 楼主| 发表于 2021-2-5 15:20:41 | 显示全部楼层
netmaple 发表于 2021-2-5 14:47
https://www.autoitx.com/thread-44194-1-1.html
这个是Dos回显UDF应该能帮到你

好的   感谢解答
 楼主| 发表于 2021-2-6 15:38:11 | 显示全部楼层
afan 发表于 2021-2-5 10:19
既然是通过流操作,你这样send应该不行… 操作流,你有读取标志 $STDERR_CHILD + $STDOUT_CHILD,但写入必 ...

A大 我搜了论坛之前的提问,看你回复过别的帖子 “貌似 telnet 不支持回显,想别的办法吧”, 现在有办法解决了嘛? 这个StdinWrite  写入字符到运行的子进程,好像也不能读取显示的结果啊
发表于 2021-2-6 16:35:55 | 显示全部楼层
itzyx 发表于 2021-2-6 15:38
A大 我搜了论坛之前的提问,看你回复过别的帖子 “貌似 telnet 不支持回显,想别的办法吧”, 现在有办法 ...

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

好的,我再看看帮助文件,找找办法,谢谢A大
发表于 2021-2-7 15:21:17 | 显示全部楼层
telnet可以直接通过tcp操作,用cmd不合适。
 楼主| 发表于 2021-2-8 09:48:53 | 显示全部楼层
zch11230 发表于 2021-2-7 15:21
telnet可以直接通过tcp操作,用cmd不合适。

额 大佬,TCP是怎么操作的,还没接触过,能否指点一二,万分感谢
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-16 12:54 , Processed in 0.079546 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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