1

我想学习和理解 StdinWrite 函数,所以写了下面这段代码。

我想向提示写入数据,读取输出,再次写入数据,然后再次读取输出。这是我写的代码。第一个 MsgBox 显示是正确的,但是第二个是空白的!为什么?

    #include <Constants.au3>
    $pid = Run("C:\Windows\system32\cmd.exe",@SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
    StdinWrite($pid,"cd ")
    StdinWrite($pid,"C:\users\test1")
    StdinWrite($pid,@CRLF)
    StdinWrite($pid)
    Local $data
    While True
        $data &= StdoutRead($pid)
        If @error Then
            MsgBox(0,"","error")
            ExitLoop
        EndIf

    WEnd
    MsgBox(0, "Debug", $data)
    StdinWrite($pid,"cd ")
    StdinWrite($pid,"C:\users\test2")
    StdinWrite($pid,@CRLF)
    StdinWrite($pid)
    $data = ""
    While True
        $data &= StdoutRead($pid)
        If @error Then
            MsgBox(0,"","error")
            ExitLoop
        EndIf

    WEnd
    MsgBox(0, "Debug", $data)
Sleep(10000)
Exit

更新: 基于 user2097265 的评论。我已将上面的代码修改为下面的代码。我在下面显示了输出。我在 Console.au3 中使用 Cout 而不是 ConsoleWrite。第二组命令似乎没有奏效。

#include <Constants.au3>
#include <Console.au3>
$pid = Run("C:\Windows\system32\cmd.exe",@SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
StdinWrite($pid,"cd ")
StdinWrite($pid,"C:\users\test1")
StdinWrite($pid,@CRLF)
Local $data
Sleep(2000)
$data &= StdoutRead($pid)
;ConsoleWrite("Debug:" & $data & @LF)
Cout( $data & @LF)
$data = ""
StdinWrite($pid,"cd ")
StdinWrite($pid,"C:\users\test2")
StdinWrite($pid,@CRLF)
StdinWrite($pid,@CRLF)
StdinWrite($pid,@CRLF)
StdinWrite($pid)
$data &= StdoutRead($pid)
;ConsoleWrite("Debug:" & $data & @LF)
Cout( $data & @LF)
MsgBox(0,"","Close")

这是输出:

Microsoft Windows [Version 6.1.7601]
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.

C:\Windows\system32>cd C:\users\test1

C:\Users\test1>
cd C:\users\test2
4

2 回答 2

0

AutoIt 拥有最好的帮助文件之一。

如果您检查帮助文件中的 StdinWrite,答案就在那里

If the function is called with no second argument, StdinWrite closes the stream and invalidates it for further writing.

试试这个代码:

#include <Constants.au3>
$pid = Run("C:\Windows\system32\cmd.exe",@SystemDir, @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD)
StdinWrite($pid,"cd ")
StdinWrite($pid,"C:\users\test1")
StdinWrite($pid,@CRLF)
Local $data
Sleep(2000)
$data &= StdoutRead($pid)
ConsoleWrite("Debug:" & $data & @LF)
StdinWrite($pid,"cd ")
StdinWrite($pid,"C:\users\test2")
StdinWrite($pid,@CRLF)
StdinWrite($pid)
$data &= StdoutRead($pid)
ConsoleWrite("Debug:" & $data & @LF)
于 2013-10-06T19:09:37.553 回答
0

你的代码很好;只需要Sleep在第二个之前StdoutRead,给它时间返回。不过我<Console.au3>没用。

要显示可能的错误,请$data &= StdoutRead($pid) & StderrRead($pid)改用。

于 2013-10-07T06:24:51.083 回答