Sign in to follow this  
Followers 0
g52

How to set the correct encoding for STDERR and STDOUT?

10 posts in this topic

#1 ·  Posted (edited)

Hi,

How to set the correct encoding for STDERR_CHILD and STDOUT_CHILD in this code? Output messages are not OK :(

Will anyone advise? Thank you.

Example()

Func Example()
    Local $iPID = Run(@ComSpec & " /c " & 'net start Apache' , "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $sOutput = ""
    While 1
        $sOutput = StdoutRead($iPID)
        If @error Then ; Exit the loop if the process closes or StdoutRead returns an error.
            ExitLoop
        EndIf
         MsgBox($MB_SYSTEMMODAL, "Stdout Read:", $sOutput)
    WEnd

    While 1
        $sOutput = StderrRead($iPID)
        If @error Then ; Exit the loop if the process closes or StderrRead returns an error.
            ExitLoop
        EndIf
        MsgBox($MB_SYSTEMMODAL, "Stderr Read:",  $sOutput)
    WEnd
EndFunc   ;==>Example

 

Edited by g52

Share this post


Link to post
Share on other sites



#2 ·  Posted

Try using the Binary mode of the StdErr/StdOutRead functions, then convert to text using BinaryToString using one of the Unicode format flags.


If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites

#3 ·  Posted

g52,

Try concatenating the output stream to $sOutput.  I don't think you need the 2nd loop...

Kylomas


Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

#4 ·  Posted

@g52,  run directly the "net" command instead of with the @ComSpec in the middle,

Using @ComSpec you will bind the i/o streams of CMD while you will lose the control of "net" command that is fired by CMD but when started it runs away from your stream's control

try with something like this:

#include <AutoItConstants.au3>
#include <MsgBoxConstants.au3>

Example()

Func Example()
    Local $sOutput = ""

    ; Local $iPID = Run(@ComSpec & " /c " & 'net start Apache' , "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $iPID = Run('net start Apache', "", @SW_HIDE, $STDERR_MERGED)

    Do
        $sOutput = StdoutRead($iPID)

        If $sOutput <> "" Then MsgBox($MB_SYSTEMMODAL, "Stdout Read:", $sOutput)

    Until @error ; Exit the loop if the process closes or StdoutRead returns an error.

EndFunc   ;==>Example

 


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites

#5 ·  Posted

Chimp,

The OP is over writing the output variable with every line streamed ($sOutput = StdoutRead($iPID)).  He/she probably wants "$sOutput &= stdoutread($IPID)". 

Quote

Using @ComSpec you will bind the i/o streams of CMD while you will lose the control of "net" command

This is a new one on me, if true, thanks for teaching me something!

kylomas


Forum Rules         Procedure for posting code

"I like pigs.  Dogs look up to us.  Cats look down on us.  Pigs treat us as equals."

- Sir Winston Churchill

Share this post


Link to post
Share on other sites

#6 ·  Posted

Thank you very much for your help ;)

I tried

#include <AutoItConstants.au3>
#include <MsgBoxConstants.au3>
#include <StringConstants.au3>

Example()

Func Example()
          Local $sOutput = ""
          Local $iPID = Run('net start Apache', "", @SW_HIDE, $STDERR_MERGED)
          Do
                    $sOutput = StdoutRead($iPID, "", True)

                    If $sOutput <> "" Then
                              MsgBox($MB_SYSTEMMODAL, "Stdout Read:", BinaryToString($sOutput, $SB_UTF8))
                    EndIf
          Until @error ; Exit the loop if the process closes or StdoutRead returns an error.
EndFunc

The result is still not right :(

2017-04-28 (1).png

Share this post


Link to post
Share on other sites

#7 ·  Posted

@g52, can you try this script?, it should encode the stdoutread data in different ways to see if there is one correct encoding.

#include <AutoItConstants.au3>
#include <MsgBoxConstants.au3>

Example()

Func Example()
    Local $sOutput = ""

    ; Local $iPID = Run(@ComSpec & " /c " & 'net start Apache' , "", @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD)
    Local $iPID = Run('net start Apache', "", @SW_HIDE, $STDERR_MERGED)

    Do
        $sOutput = StdoutRead($iPID, False, True) ; reads the data as binary instead of text

        If $sOutput <> "" Then MsgBox($MB_SYSTEMMODAL, "Stdout Read:", _
                "1 ANSI " & BinaryToString($sOutput, 1) & @CRLF & _
                "2 UTF16LE " & BinaryToString($sOutput, 2) & @CRLF & _
                "3 UTF16BE " & BinaryToString($sOutput, 3) & @CRLF & _
                "4 UTF8 " & BinaryToString($sOutput, 4))

    Until @error ; Exit the loop if the process closes or StdoutRead returns an error.

EndFunc   ;==>Example

 


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites

#8 ·  Posted

@Chimp

Yes, here is the result. I am sad from this :(

 

2017-04-29 (2).png

2017-04-29 (3).png

Share this post


Link to post
Share on other sites

#9 ·  Posted

_WinAPI_MultiByteToWideChar?

Share this post


Link to post
Share on other sites

#10 ·  Posted

I do not understand how to paste it into the code. Do you advise?

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0