【问题标题】:Command prompt and AutoIt/StdinWrite命令提示符和 AutoIt/StdinWrite
【发布时间】:2017-10-26 06:33:44
【问题描述】:

我想学习和理解 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 的 cmets。我已将上面的代码修改为下面的代码。我在下面显示了输出。我在 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

【问题讨论】:

    标签: command-prompt autoit


    【解决方案1】:

    你的代码没问题;在第二个StdoutRead 之前也只需要Sleep,让它有时间返回。不过我没有使用&lt;Console.au3&gt;

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

    【讨论】:

      【解决方案2】:

      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)
      

      【讨论】:

      • 我照你说的做了。我没看到任何东西。但我想我不知道如何使用 ConsoleWrite。如何查看 ConsoleWrite 的输出?
      • 我对 ConsoleWrite 做了一些研究 - 我相信如果我使用 CUI 选项进行编译,我应该能够看到输出,但是 SciTE 中的这个选项在哪里?
      • 我已根据您的回答更新了我的查询。我也发布了输出。我没有得到我需要的输出。
      • 当你问我时请使用@Milos,这样我会得到通知。你可以在 scite 的底部看到 Console Write 数据和它的 live。在 scite 中打开你的脚本,按 F5 并观察它的底部。只需在最后一个 StdoutRead($pid) Cheers mate 之前添加另一个 Sleep(2000)
      • 当您在 Scite 中看不到输出区域时,您需要按{F8},它会出现在您的脚本下方。但是当您在 Scite 中使用{F5} 运行脚本时,它应该会自动出现。是的,正如我已经发布的那样,@Milos 是正确的。您需要另一个Sleep 来等待输出完成。或者以编程方式继续阅读,直到您得到与 "" 不同的结果。
      猜你喜欢
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 2010-11-30
      • 2016-06-21
      • 2017-04-22
      相关资源
      最近更新 更多