mLipok Posted June 11, 2016 Share Posted June 11, 2016 (edited) Few times there was disscusion how to show/store ConsoleWrite() message from GUI based script. This is my solution. To check how this work you should: Download and compile to exe file this scirpt: TESTING.au3 ConsoleWrite('Some text' & @CRLF) Download and compile to exe file this scirpt: ConsoleWrapper.au3 expandcollapse popup;~ https://www.autoitscript.com/forum/topic/183043-autoit-console-data-to-file #pragma compile(Console, true) #include <AutoItConstants.au3> #include <MsgBoxConstants.au3> #include <FileConstants.au3> If $CmdLine[0] = 0 Then Exit Example() Func Example() Local $sCommand = $CmdLine[1] If $CmdLine[0] > 1 Then For $iCMD_idx = 2 To $CmdLine[0] $sCommand &= ' ' & $CmdLine[$iCMD_idx] Next EndIf Local $iPID = Run(@ComSpec & " /c " & $sCommand, @SystemDir, Default, $RUN_CREATE_NEW_CONSOLE + $STDERR_CHILD + $STDOUT_CHILD) Local $sOutput = _ @CRLF & @CRLF & _ 'THIS IS LOG FILE FOR:' & @CRLF & _ $sCommand & @CRLF & _ 'LOG START TIME: ' & _LogGetDate() & @CRLF & _ 'RESULT:' & @CRLF & _ '=====================================' & @CRLF & _ '' Local $hFile = FileOpen('ConsoleWrite_' & StringRegExpReplace(_LogGetDate(),'\D','_') & '.log', $FO_OVERWRITE + $FO_UTF8_NOBOM) ConsoleWrite($sOutput) FileWrite($hFile, $sOutput) While 1 $sOutput = StdoutRead($iPID) If @error Then ; Exit the loop if the process closes or StdoutRead returns an error. ExitLoop EndIf ConsoleWrite($sOutput) FileWrite($hFile, $sOutput) WEnd $sOutput = _ '=====================================' & @CRLF & _ 'LOG END TIME: ' & _LogGetDate() & @CRLF & _ '' ConsoleWrite($sOutput) FileWrite($hFile, $sOutput) FileClose($hFile) EndFunc ;==>Example Func _LogGetDate() Return @YEAR & '/' & @MON & '/' & @MDAY & ' ' & @HOUR & ':' & @MIN & ':' & @SEC EndFunc ;==>_LogGetDate Run CMD in your CMD window you should make a command: ConsoleWrapper.exe TESTING.exe REMARK: as a parameter for: ConsoleWrapper.exe you should use File Full Path for TESTING.exe file I test it like this: z:\Test>ConsoleWrapper.exe z:\Test\TESTING.exe THIS IS LOG FILE FOR: z:\Test\TESTING.exe LOG START TIME: 2016/06/12 00:32:11 RESULT: ===================================== Some text ===================================== LOG END TIME: 2016/06/12 00:32:11 z:\Test> Enoy yourself for testing mLipok Edited September 16, 2016 by mLipok Signature beginning:* Please remember: "AutoIt"..... * Wondering who uses AutoIt and what it can be used for ? * Forum Rules ** ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Code * for other useful stuff click the following button: Spoiler Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API * ErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 * My contribution to others projects or UDF based on others projects: * _sql.au3 UDF * POP3.au3 UDF * RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF * SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane * Useful links: * Forum Rules * Forum etiquette * Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * Wiki: * Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX IE Related: * How to use IE.au3 UDF with AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskScheduler * IE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related: * How to get reference to PDF object embeded in IE * IE on Windows 11 * I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions * EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *I also encourage you to check awesome @trancexx code: * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuff * OnHungApp handler * Avoid "AutoIt Error" message box in unknown errors * HTML editor * winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/ "Homo sum; humani nil a me alienum puto" - Publius Terentius Afer"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming" , be and \\//_. Anticipating Errors : "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty." Signature last update: 2023-04-24 Link to comment Share on other sites More sharing options...
TheDcoder Posted June 9, 2017 Share Posted June 9, 2017 I think this is a much easier and better way to capture ConsoleWrite output from a compiled GUI AutoIt Script #include <Process.au3> $sExe = @ScriptDir & '\GUI Script.exe' $sLogFile = @ScriptDir & '\output.txt' $sCommand = @ComSpec & ' /c "' & $sExe & '" > "' & $sLogFile & '"' _RunDos($sCommand) EasyCodeIt - A cross-platform AutoIt implementation - Fund the development! (GitHub will double your donations for a limited time) DcodingTheWeb Forum - Follow for updates and Join for discussion Link to comment Share on other sites More sharing options...
LukeLe Posted August 9, 2019 Share Posted August 9, 2019 Hi @mLipok, I tried with dos command pscp -r -scp rrt_runin root@192.168.10.20:/usr/local/factory/ but AutoIT can not capture the output if this command fails The fail output is like rrt_runin: No such file or directory The output can be captured by SciTe if I set workingdir in Run command as @ScriptDir or "", but using StdouRead() can not capture above line This is my source code #include <Constants.au3> #include <Debug.au3> #include <Array.au3> Local $cDisk = Run(@ComSpec & " /c pscp -r -scp rrt_runin root@192.168.10.20:/usr/local/factory/","", @SW_HIDE, $STDIN_CHILD + $STDOUT_CHILD) Global $cData = "" While 1 $line = StdoutRead($cDisk) If @error Then ExitLoop $cData &= $line WEnd While 1 $line = StderrRead($cDisk) If @error Then ExitLoop $cData = $cData & @CR & $line WEnd MsgBox(0, "", "" & $cData) FYI, the pscp program is installed when I install PuTTY Best regards, Luke Wondering who uses AutoIT and what it can be used for? Link to comment Share on other sites More sharing options...
Developers Jos Posted August 9, 2019 Developers Share Posted August 9, 2019 That looks like an Error, so why don't you try to capture also STDERR? Jos SciTE4AutoIt3 Full installer Download page - Beta files Read before posting How to post scriptsource Forum etiquette Forum Rules Live for the present, Dream of the future, Learn from the past. Link to comment Share on other sites More sharing options...
LukeLe Posted August 9, 2019 Share Posted August 9, 2019 Thank @Jos, I managed to capture the error message using $STDIN_CHILD +$STDERR_MERGED Local $cDisk = Run(@ComSpec & " /c pscp -r -scp rrt_runin root@192.168.10.20:/usr/local/factory/","", @SW_HIDE, $STDIN_CHILD +$STDERR_MERGED ) Wondering who uses AutoIT and what it can be used for? Link to comment Share on other sites More sharing options...
LukeLe Posted August 14, 2019 Share Posted August 14, 2019 (edited) Sorry, It's me again. I'm trying to make some upgrade to my program. Instead of using pscp, I changed to use scp since pscp have trouble downloading some *.a files. The script can not catch the password prompt. This is the output of my program running with CUI: Inputting the password into this window directly WORKS. EDIT, I read this article about Windows Command-Line, but this is beyond my current understanding. EDIT, I tried Run function with parameter $RUN_CREATE_NEW_CONSOLE + $STDIN_CHILD + $STDERR_MERGED, when running the .exe, no prompt appear. The prompt only appears with $STDIN_CHILD + $STDERR_MERGED. However, if running by pressing F5 in SciTE, below is full output captured >"C:\Program Files (x86)\AutoIt3\SciTE\..\AutoIt3.exe" "C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3" /run /prod /ErrorStdOut /in "E:\SelfStudy\AutoIT\Projects\SSH_Connect\Test.au3" /UserParams +>14:32:46 Starting AutoIt3Wrapper v.19.102.1901.0 SciTE v.4.1.2.0 Keyboard:00000409 OS:WIN_7/Service Pack 1 CPU:X64 OS:X64 Environment(Language:0409) CodePage:0 utf8.auto.check:4 +> SciTEDir => C:\Program Files (x86)\AutoIt3\SciTE UserDir => C:\Users\V0924813\AppData\Local\AutoIt v3\SciTE\AutoIt3Wrapper SCITE_USERHOME => C:\Users\V0924813\AppData\Local\AutoIt v3\SciTE >Running AU3Check (3.3.14.5) from:C:\Program Files (x86)\AutoIt3 input:E:\SelfStudy\AutoIT\Projects\SSH_Connect\Test.au3 +>14:32:46 AU3Check ended.rc:0 >Running:(3.3.14.5):C:\Program Files (x86)\AutoIt3\autoit3.exe "E:\SelfStudy\AutoIT\Projects\SSH_Connect\Test.au3" +>Setting Hotkeys...--> Press Ctrl+Alt+Break to Restart or Ctrl+Break to Stop X64 arch Executing:scp -o "StrictHostKeyChecking=no" -r luke@172.18.65.109:/Temp/Luke/PON_Link_down_20190517/TestSCP/ ./2019-08-09 It lacks the password prompt. I think the prompt is from another process than scp.exe. So the StdoutRead can't read it. This is my source code expandcollapse popup#include <GUIConstants.au3> #include <Debug.au3> #include <Array.au3> #include <WinAPIFiles.au3> #include <WinAPIProc.au3> #include <Process.au3> If @OSArch = "X64" Then _WinAPI_Wow64EnableWow64FsRedirection(True) ConsoleWrite("X64 arch" & @CRLF) EndIf Local $cDisk = _OSExecuteCmdCommand('scp -o "StrictHostKeyChecking=no" -r luke@172.18.65.109:/Temp/Luke/PON_Link_down_20190517/TestSCP/ ./2019-08-09') Global $cData = "" While 1 $line = StdoutRead($cDisk) If @error Or Not ProcessExists($cDisk) Then ExitLoop ;~ $aChild = _WinAPI_EnumChildProcess($cDisk) ;~ If IsArray($aChild) Then ;~ For $i = 1 To $aChild[0][0] ;~ Local $sTmp = StdoutRead($aChild[$i][1]) ;~ If StringLen($sTmp) > 0 Then ;~ _ArrayDisplay($aChild) ;~ ConsoleWrite("Processing child" & @TAB) ;~ _ProcessSCPOutput($sTmp, $aChild[$i][1]) ;~ $line &= $sTmp ;~ EndIf ;~ Next ;~ EndIf If StringLen($line) > 0 Then ConsoleWrite("Processing " & $line & @CRLF) _ProcessSCPOutput($line, $cDisk) $cData &= $line ConsoleWrite("|<<" & @CRLF) EndIf WEnd Func _OSExecuteCmdCommand($sCmd) Local $iPID ConsoleWrite("Executing:" & $sCmd & @CRLF) If @OSArch = "X64" Then DllCall('kernel32.dll', 'int', 'Wow64EnableWow64FsRedirection', 'int', 0) $iPID = Run(@ComSpec & " /C " & $sCmd, "", @SW_HIDE, $STDIN_CHILD + $STDERR_MERGED) DllCall('kernel32.dll', 'int', 'Wow64EnableWow64FsRedirection', 'int', 1) Else $iPID = Run(@ComSpec & " /C " & $sCmd, "", @SW_HIDE, $STDIN_CHILD + $STDERR_MERGED) EndIf Return $iPID EndFunc ;==>_OSExecuteCmdCommand Func _ProcessSCPOutput($sOut, $PID) Local $retStr = "" If StringInStr($sOut, "(y/n") Then StdinWrite($PID, "y" & @CRLF) If StringInStr($sOut, "(yes/no") Then StdinWrite($PID, "yes" & @CRLF) If (StringInStr($sOut, "password:")) Then Sleep(100) ConsoleWrite("Enter password" & @CRLF) StdinWrite($PID, "luke" & @CRLF) StdinWrite($PID) If @error Then MsgBox(0, "Error", "Can not write to stdin. ErrCode:" & @error) Exit EndIf Sleep(200) $sOut = StdoutRead($PID) EndIf EndFunc ;==>_ProcessSCPOutput Edited August 15, 2019 by LukeLe Update ouput when run the *.exe file with different parameters of Run() Wondering who uses AutoIT and what it can be used for? Link to comment Share on other sites More sharing options...
mLipok Posted August 14, 2019 Author Share Posted August 14, 2019 I'm on vacation, will try to look at your problem ASAP... maybe somebody else will have a while to take a look earlier. LukeLe 1 Signature beginning:* Please remember: "AutoIt"..... * Wondering who uses AutoIt and what it can be used for ? * Forum Rules ** ADO.au3 UDF * POP3.au3 UDF * XML.au3 UDF * IE on Windows 11 * How to ask ChatGPT for AutoIt Code * for other useful stuff click the following button: Spoiler Any of my own code posted anywhere on the forum is available for use by others without any restriction of any kind. My contribution (my own projects): * Debenu Quick PDF Library - UDF * Debenu PDF Viewer SDK - UDF * Acrobat Reader - ActiveX Viewer * UDF for PDFCreator v1.x.x * XZip - UDF * AppCompatFlags UDF * CrowdinAPI UDF * _WinMergeCompare2Files() * _JavaExceptionAdd() * _IsBeta() * Writing DPI Awareness App - workaround * _AutoIt_RequiredVersion() * Chilkatsoft.au3 UDF * TeamViewer.au3 UDF * JavaManagement UDF * VIES over SOAP * WinSCP UDF * GHAPI UDF - modest begining - comunication with GitHub REST API * ErrorLog.au3 UDF - A logging Library * Include Dependency Tree (Tool for analyzing script relations) * Show_Macro_Values.au3 * My contribution to others projects or UDF based on others projects: * _sql.au3 UDF * POP3.au3 UDF * RTF Printer - UDF * XML.au3 UDF * ADO.au3 UDF * SMTP Mailer UDF * Dual Monitor resolution detection * * 2GUI on Dual Monitor System * _SciLexer.au3 UDF * SciTE - Lexer for console pane * Useful links: * Forum Rules * Forum etiquette * Forum Information and FAQs * How to post code on the forum * AutoIt Online Documentation * AutoIt Online Beta Documentation * SciTE4AutoIt3 getting started * Convert text blocks to AutoIt code * Games made in Autoit * Programming related sites * Polish AutoIt Tutorial * DllCall Code Generator * Wiki: * Expand your knowledge - AutoIt Wiki * Collection of User Defined Functions * How to use HelpFile * Good coding practices in AutoIt * OpenOffice/LibreOffice/XLS Related: WriterDemo.au3 * XLS/MDB from scratch with ADOX IE Related: * How to use IE.au3 UDF with AutoIt v3.3.14.x * Why isn't Autoit able to click a Javascript Dialog? * Clicking javascript button with no ID * IE document >> save as MHT file * IETab Switcher (by LarsJ ) * HTML Entities * _IEquerySelectorAll() (by uncommon) * IE in TaskScheduler * IE Embedded Control Versioning (use IE9+ and HTML5 in a GUI) * PDF Related: * How to get reference to PDF object embeded in IE * IE on Windows 11 * I encourage you to read: * Global Vars * Best Coding Practices * Please explain code used in Help file for several File functions * OOP-like approach in AutoIt * UDF-Spec Questions * EXAMPLE: How To Catch ConsoleWrite() output to a file or to CMD *I also encourage you to check awesome @trancexx code: * Create COM objects from modules without any demand on user to register anything. * Another COM object registering stuff * OnHungApp handler * Avoid "AutoIt Error" message box in unknown errors * HTML editor * winhttp.au3 related : * https://www.autoitscript.com/forum/topic/206771-winhttpau3-download-problem-youre-speaking-plain-http-to-an-ssl-enabled-server-port/ "Homo sum; humani nil a me alienum puto" - Publius Terentius Afer"Program are meant to be read by humans and only incidentally for computers and execute" - Donald Knuth, "The Art of Computer Programming" , be and \\//_. Anticipating Errors : "Any program that accepts data from a user must include code to validate that data before sending it to the data store. You cannot rely on the data store, ...., or even your programming language to notify you of problems. You must check every byte entered by your users, making sure that data is the correct type for its field and that required fields are not empty." Signature last update: 2023-04-24 Link to comment Share on other sites More sharing options...
LukeLe Posted August 17, 2019 Share Posted August 17, 2019 (edited) I dug into the content of Windows Command-Line: Inside the Windows Console, I realized that capturing the output of cmd.exe is very hard to achieve, as quoted from the link Quote There are some problems here because Console does things a little differently from *NIX: Console and Command-Line app communicate via IOCTL messages through the driver, not via text streams (as in *NIX) Windows mandates that ConHost.exe is the Console app which is connected to Command-Line apps Windows controls the creation of the communication “pipes” via which the Console and Command-Line app communicate What if you wanted to create an alternate Console app for Windows? How would you send keyboard/mouse/pen/etc. user actions to the Command-Line app if you couldn’t access the communications “pipes” connecting your new Console to the Command-Line app? Alas, the story here is not a good one: There ARE some great 3rd party Consoles (and server apps) for Windows (e.g. ConEmu/Cmder, Console2/ConsoleZ, Hyper, Visual Studio Code, OpenSSH, etc.), but they have to jump through extraordinary hoops to act like a normal Console would. For example, 3rd party Consoles have to launch a Command-Line app off-screen at, for example, (-32000,-32000). They then have to send keystrokes to the off-screen Console, and screen-scrape the off-screen Console’s text contents and re-draw them on their own UI! I know, crazy, right?! It’s a testament to the ingenuity and determination of the creators of these apps that they even work at all. 2 Update for the case of scp command: The call sequence: cmd.exe (@Comspec) => scp.exe/connhost.exe (sorry I don't know scp or conhost is run fist) => ssh.exe The prompt belongs to ssh.exe process Edited August 17, 2019 by LukeLe update binary call sequence for the case of scp.exe Wondering who uses AutoIT and what it can be used for? Link to comment Share on other sites More sharing options...
LukeLe Posted August 17, 2019 Share Posted August 17, 2019 (edited) Hello, I found a workaround!As scp stands for Secure Copy, it needs ssh.exe for the secure (encryption) part and it runs as the sequence in the above post. Instead of running sole scp.exe command, I change the sequence a little bit, now I run ssh first (using plink.exe), then callscp command lile below plink.exe -ssh -t luke@172.18.65.109 scp -o "StrictHostKeyChecking=no" -r luke@172.18.65.109:/Temp/Luke/PON_Link_down_20190517/TestSCP/ ./2019-08-09 by doing so, I can capture & interact with the login prompt. Sorry, EDITED. The workaround FAILED because it executes SCP in the remote server, not the current machine. Edited August 21, 2019 by LukeLe wrong behavior understanding Wondering who uses AutoIT and what it can be used for? Link to comment Share on other sites More sharing options...
LukeLe Posted August 24, 2019 Share Posted August 24, 2019 In the end, I have two alternative solutions: Use pscp - a command line untility of scp which goes along with PuTTY install package. Use WinSCP - a software support scp, sftp. It has pretty handy command line guide Wondering who uses AutoIT and what it can be used for? Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now