找回密码
 加入
搜索
查看: 19393|回复: 32

[AU3基础] [已解决]请问如何获取cmd后台信息并强行退出cmd?

 火.. [复制链接]
发表于 2014-2-6 09:29:25 | 显示全部楼层 |阅读模式
本帖最后由 smooth 于 2014-3-25 11:43 编辑

使用AU3执行一个SQL脚本之后,如果密码是正确的,则连接到ORACLE数据库等待用户操作,如果密码是错误的,则等待用户输入用户名,两种情况的截图如下(当然,用AU3执行时是在后台的,我是用CMD脚本来执行才有CMD窗口截图的)。
密码正确时cmd后台情况(本来想上传截图的,但是不知道怎么回事论坛附件无法上传):
C:\Users\Administrator\Desktop>sqlplus system/123456 @oracle.sql

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 2月 6 09:22:48 2014

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


连接到:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL>
密码错误时cmd后台情况:
C:\Users\Administrator\Desktop>sqlplus system/12345 @oracle.sql

SQL*Plus: Release 11.2.0.1.0 Production on 星期四 2月 6 09:22:12 2014

Copyright (c) 1982, 2010, Oracle.  All rights reserved.

ERROR:
ORA-01017: invalid username/password; logon denied


请输入用户名:
问题:当密码正确时,请教如何获取cmd里面的“连接到”这三个字?然后强行向cmd发送中断命令Ctrl+C,并发送Y确认,然后发送回车;当密码错误时,请教如何获取cmd里面的“ERROR”这格信息?然后强行向cmd发送中断命令Ctrl+C,并发送Y确认,然后发送回车。

run命令有个参数 0x2 ($STDOUT_CHILD) ,提供一个句柄到子进程的 STDOUT 流,可是不会用。谢谢!
发表于 2014-2-6 09:39:43 | 显示全部楼层
$foo = Run(@ComSpec & " /c (for /f ""tokens=*"" %i in ('sqlplus system/12345 @oracle.sql
^| find ""连接到""') do @echo %i) ", "C:\", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
 楼主| 发表于 2014-2-6 11:00:34 | 显示全部楼层
本帖最后由 smooth 于 2014-2-6 11:06 编辑

回复 2# hnfeng

请教然后如何使用这个变量?我用MSGBOX来输出,每次都会得到一个不同的数字,好像没有意义呀?
发表于 2014-2-6 12:26:09 | 显示全部楼层
回复 3# smooth
#include <Constants.au3>
$foo = Run(@ComSpec & " /c (for /f ""tokens=*"" %i in ('ping -n 2 www.qq.com ^| find ""TTL""') do @echo %i) ", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
ProcessWaitClose($foo)
$text=StdoutRead($foo)
If Not @error Then
  MsgBox(0, "STDOUT read:", $text)
Else
  MsgBox(0,"xxxx","xxxxxxxxxxxxxxx")
EndIf
 楼主| 发表于 2014-2-6 12:53:59 | 显示全部楼层
回复 4# hnfeng
#include <Constants.au3>
$foo = Run(@ComSpec & " /c (for /f ""tokens=*"" %i in ('sqlplus system/12345 @oracle.sql ^| find ""连接到""') do @echo %i) ", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
ProcessWaitClose($foo)
$text=StdoutRead($foo)
If Not @error Then
  MsgBox(0, "STDOUT read:", $text)
Else
  MsgBox(0,"xxxx","xxxxxxxxxxxxxxx")
EndIf
你真帮了我的大忙了,谢谢!
发表于 2014-2-6 12:59:50 | 显示全部楼层
回复 5# smooth


    不客气,我是刚刚学习au3
刚好需要用到这个才记下的,只是照葫芦画瓢而已
 楼主| 发表于 2014-2-6 15:30:19 | 显示全部楼层
回复 6# hnfeng

有个问题,就是无法结束cmd.exe进程,导致程序卡死。
$fooo = Run(@ComSpec & " /c (for /f ""tokens=*"" %i in ('sqlplus system/123456 @Oracle.sql" &"^| findstr ""ERROR""') do @echo %i) ", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
ProcessWaitClose($fooo)
$text = StdoutRead($fooo)
If Not @error Then
    MsgBox(16, "密码错误", "Oracle数据库system账户密码错误,请检查后重新输入!", "", $Form1)
Else
    msgbox(16, "密码正确", "Oracle数据库system账户密码正确!", "", $Form1)
发表于 2014-2-6 15:39:06 | 显示全部楼层
/c 是运行完成后自动退出CMD,我实验没有cmd进程哦
仔细看看,你的命令貌似进入了 sql> 而不是 C:\> 这样的DOS提示符,就是说还没有运行完成,所以你需要去看看 sql 的有关命令了,我不懂哦
以前看过有网友写过在cmd里面自动 ftp 的脚本(就几行命令),自动在 cmd 中给 ftp> 输入命令然后退出。

评分

参与人数 1威望 +5 金钱 +100 贡献 +5 收起 理由
afan + 5 + 100 + 5 多次热心助人,补上 :)

查看全部评分

发表于 2014-2-6 15:42:34 | 显示全部楼层
回复 7# smooth


    CMD中自动FTP的脚本,你参考下:
@echo off
echo 处理中,请稍候...
echo open 127.0.0.1 >1.txt
echo 用户名 >>1.txt
echo 密码 >>1.txt
echo get 1.exe >>1.txt
ftp -s:1.txt
echo 哈哈
 楼主| 发表于 2014-2-6 16:02:41 | 显示全部楼层
回复 8# hnfeng

不是已经有结束进程的命令了吗?怎么还会卡住了?而且奇怪的很啊,我单独拿出来测试没有问题,放入我的脚本中,在编辑框里测试,也没有问题,但是编译成EXE文件之后,测试就会卡死。见鬼了。
 楼主| 发表于 2014-2-6 16:14:00 | 显示全部楼层
本帖最后由 smooth 于 2014-2-6 16:15 编辑

回复 8# hnfeng

你说的有道理,如果是SQL SERVER数据,当密码错误时,知退出到CMD环境的,而当密码正确时,就进入了SQLCMD的状态。如果是Oracle数据库,不管密码是正确还是错误,都是进入了Sqlplus的状态中。我原来以为通过ProcessWaitClose($foo)就能退出这中状态的。但是单独测试的时候,AU3脚本可以退出来呀?这是怎么回事呢?
发表于 2014-2-6 17:53:41 | 显示全部楼层
本帖最后由 hnfeng 于 2014-2-6 17:57 编辑

ProcessWaitClose($foo) 是等待CMD命令结束后才继续后面的命令,以便获取到正确的返回结果。这不是关闭命令哦。

CMD /C 就是执行字符串指定的命令然后终止CMD,所以只要你的命令能终止,就没问题。你在检查下吧
发表于 2014-2-6 20:17:17 | 显示全部楼层
你试着将 @SW_HIDE 改为 @SW_SHOW, 这样可能可以看到CMD窗口
如果CMD一闪而过,就正常,如果卡到哪里,例如进到 sql> 状态,可以看到cmd信息,以便对症处理
 楼主| 发表于 2014-2-6 21:28:48 | 显示全部楼层
回复 13# hnfeng

进入数据库的连接状态,也就是进入了sqlplus环境之后,代码就卡在那里,无法继续往下执行。而为了检测密码的正确性去执行一个sql脚本时,又不可避免的要陷入sqlplus环境。oracle数据真麻烦,目前没有解决办法。

而SQL Server数据库,提供了一个 i参数,不管执行成功还是错误,自动退出sqlcmd环境。
发表于 2014-2-7 11:28:15 | 显示全部楼层
本帖最后由 hnfeng 于 2014-2-7 11:50 编辑
#include <Constants.au3>
$foo = Run(@ComSpec & " /c (for /f ""tokens=*"" %i in ('ping -n 15 www.qq.com ^| find ""TTL""') do @echo %i) ", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
;ProcessWaitClose($foo)
Sleep(4000)
If WinExists("C:\Windows\system32\cmd.exe") Then WinKill("C:\Windows\system32\cmd.exe")
$text=StdoutRead($foo)
If Not @error Then
  MsgBox(0, "STDOUT read:", $text)
Else
  MsgBox(0,"咦?","PING不通哦……")
EndIf
本来命令里面要ping15次,大约15秒才能返回信息,但是用了 sleep(4000) 就是大约4秒延时,强行关闭CMD,并返回信息。
就是说,在大约4秒延时后,如果仍然存在 CMD 窗口,就强行关闭它,并返回信息,
如果CMD自己在4秒内自己关闭了,就直接返回信息
我在SciTE 中以及编译为EXE 都测试通过。

注意下面命令应该屏蔽或删掉哦, 不然的话会一直卡在这里的。
;ProcessWaitClose($foo)

或者你把 ping -n 15 www.qq.com 改为 ping -t www.qq.com, 这样cmd会一直在ping,不会自己关闭的。
延时到了就强行关闭了
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-2 21:31 , Processed in 0.083326 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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