Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. How to use Windows QT to call WSL cmd?
Forum Updated to NodeBB v4.3 + New Features

How to use Windows QT to call WSL cmd?

Scheduled Pinned Locked Moved Unsolved General and Desktop
37 Posts 3 Posters 5.5k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • N NTU_WTY

    @JonB Thank you. Yes, I've tested in Command Prompt and it recognized wsl and listed files and folders in the default directory. As I remove the redirection part and set a breakpoint in debug mode, the output variable is empty after sh.readAll(). No error shows after writing in QStringList, not as it would show: "wsl is not recognized as an internal or external command" when writing in my original QProcess::execute way.`

    JonBJ Online
    JonBJ Online
    JonB
    wrote on last edited by
    #7

    @NTU_WTY
    I would still put in fuller error checking (look at the docs for QProcess). For a start, what is the return result from sh.waitForFinished();?

    N 1 Reply Last reply
    1
    • jsulmJ jsulm

      @NTU_WTY said in How to use Windows QT to call WSL cmd?:

      "C:\Windows\System32\wsl.exe ls >> res.txt"

      Try to split this into 4 parameters instead of one

      N Offline
      N Offline
      NTU_WTY
      wrote on last edited by
      #8

      @jsulm Thank you. The res.txt is still empty after I separate the command into sh.start("cmd", QStringList() << "/c" << "C:\\Windows\\System32\\wsl.exe" << "ls" << ">>" << "res.txt");.

      @JonB said in How to use Windows QT to call WSL cmd?:

      waitForFinished

      1 Reply Last reply
      0
      • N NTU_WTY

        @JonB Thank you. Yes, I've tested in Command Prompt and it recognized wsl and listed files and folders in the default directory. As I remove the redirection part and set a breakpoint in debug mode, the output variable is empty after sh.readAll(). No error shows after writing in QStringList, not as it would show: "wsl is not recognized as an internal or external command" when writing in my original QProcess::execute way.`

        JonBJ Online
        JonBJ Online
        JonB
        wrote on last edited by JonB
        #9

        @NTU_WTY said in How to use Windows QT to call WSL cmd?:

        No error shows after writing in QStringList, not as it would show: "wsl is not recognized as an internal or external command" when writing in my original QProcess::execute way.`

        What do you mean by this? If you are saying you originally used QProcess::execute("C:\\Windows\\System32\\wsl.exe", ...) or "wsl" or "cmd /c ..." or whatever and got "wsl is not recognized as an internal or external command" then please show what exact command you did that way.

        Your latest reply does not say what returned from waitForFinished (cut off)?

        I trust you really tried cmd /c C:\Windows\System32\wsl.exe verbatim in a Command Prompt?

        If you cannot resolve this, stop using waitForFinished, hook up all the signals from QProcess and see what is happening. Like I wrote earlier, start by diagnosing/getting it working without the file redirection.

        N 1 Reply Last reply
        0
        • JonBJ JonB

          @NTU_WTY
          I would still put in fuller error checking (look at the docs for QProcess). For a start, what is the return result from sh.waitForFinished();?

          N Offline
          N Offline
          NTU_WTY
          wrote on last edited by
          #10

          @JonB It's true. I also check readAllStandardError() but I'm not sure I wrote it correctly: qDebug() << sh.readAllStandardError();, and it prints:

          "'C:\\Windows\\System32\\wsl.exe' \xA4\xA3\xACO\xA4\xBA\xB3\xA1\xA9\xCE\xA5~\xB3\xA1\xA9R\xA5O\xA1""B\xA5i\xB0\xF5\xA6\xE6\xAA\xBA\xB5{\xA6\xA1\xA9\xCE\xA7\xE5\xA6\xB8\xC0\xC9\xA1""C\r\n
          
          JonBJ 1 Reply Last reply
          0
          • N NTU_WTY

            @JonB It's true. I also check readAllStandardError() but I'm not sure I wrote it correctly: qDebug() << sh.readAllStandardError();, and it prints:

            "'C:\\Windows\\System32\\wsl.exe' \xA4\xA3\xACO\xA4\xBA\xB3\xA1\xA9\xCE\xA5~\xB3\xA1\xA9R\xA5O\xA1""B\xA5i\xB0\xF5\xA6\xE6\xAA\xBA\xB5{\xA6\xA1\xA9\xCE\xA7\xE5\xA6\xB8\xC0\xC9\xA1""C\r\n
            
            JonBJ Online
            JonBJ Online
            JonB
            wrote on last edited by JonB
            #11

            @NTU_WTY
            That looks worrying to me! Whatever it's supposed to be, the fact that something is even echoing back 'C:\\Windows\\System32\\wsl.exe' ... looks like some kind of error to me....

            I have asked several times what exactly you tested in Command Prompt....

            Oh, and a huge "BTW" when you do use the redirection and say res.txt is still empty: where are you looking, what do you think the current working directory of your Qt app is? Have you checked with specifying an absolute path?

            Please stop trying the redirection for a while, it only complicates. Try one of these:

            • sh.start("cmd", QStringList() << "/c" << "C:\\Windows\\System32\\wsl.exe ls");
            • sh.start("C:\\Windows\\System32\\wsl.exe", QStringList() << "ls");

            Especially the second one. I would not use waitFor..., at least while I diagnosed, I would use the signals/slots including for errors, as I wrote earlier.

            1 Reply Last reply
            0
            • JonBJ JonB

              @NTU_WTY said in How to use Windows QT to call WSL cmd?:

              No error shows after writing in QStringList, not as it would show: "wsl is not recognized as an internal or external command" when writing in my original QProcess::execute way.`

              What do you mean by this? If you are saying you originally used QProcess::execute("C:\\Windows\\System32\\wsl.exe", ...) or "wsl" or "cmd /c ..." or whatever and got "wsl is not recognized as an internal or external command" then please show what exact command you did that way.

              Your latest reply does not say what returned from waitForFinished (cut off)?

              I trust you really tried cmd /c C:\Windows\System32\wsl.exe verbatim in a Command Prompt?

              If you cannot resolve this, stop using waitForFinished, hook up all the signals from QProcess and see what is happening. Like I wrote earlier, start by diagnosing/getting it working without the file redirection.

              N Offline
              N Offline
              NTU_WTY
              wrote on last edited by
              #12

              No error shows after writing in QStringList, not as it would show: "wsl is not recognized as an internal or external command" when writing in my original QProcess::execute way.`

              What do you mean by this? If you are saying you originally used QProcess::execute("C:\\Windows\\System32\\wsl.exe", ...) or "wsl" or "cmd /c ..." or whatever and got "wsl is not recognized as an internal or external command" then please show what exact command you did that way.

              QProcess::execute("cmd /c wsl ls")
              QProcess::execute("cmd /c C:/Windows/System32/wsl.exe ls");
              I wrote in above ways that both not recognized wsl. But if I open the cmd prompt, power shell, or MinGW terminal, they all recognize wsl.

              About the following two lines:

              • sh.start("cmd", QStringList() << "/c" << "C:\\Windows\\System32\\wsl.exe ls");
              • sh.start("C:\\Windows\\System32\\wsl.exe", QStringList() << "ls");

              They will get false returned from waitForFinished immediately. But the readAllStandardError() shows empty. (Previous true also immediately. Not sure what does that mean...)
              Sorry I don't know how to "hook up all signals from QProcess". Can you give me more hint when you have time? Thank you very much.

              JonBJ 1 Reply Last reply
              0
              • N NTU_WTY

                No error shows after writing in QStringList, not as it would show: "wsl is not recognized as an internal or external command" when writing in my original QProcess::execute way.`

                What do you mean by this? If you are saying you originally used QProcess::execute("C:\\Windows\\System32\\wsl.exe", ...) or "wsl" or "cmd /c ..." or whatever and got "wsl is not recognized as an internal or external command" then please show what exact command you did that way.

                QProcess::execute("cmd /c wsl ls")
                QProcess::execute("cmd /c C:/Windows/System32/wsl.exe ls");
                I wrote in above ways that both not recognized wsl. But if I open the cmd prompt, power shell, or MinGW terminal, they all recognize wsl.

                About the following two lines:

                • sh.start("cmd", QStringList() << "/c" << "C:\\Windows\\System32\\wsl.exe ls");
                • sh.start("C:\\Windows\\System32\\wsl.exe", QStringList() << "ls");

                They will get false returned from waitForFinished immediately. But the readAllStandardError() shows empty. (Previous true also immediately. Not sure what does that mean...)
                Sorry I don't know how to "hook up all signals from QProcess". Can you give me more hint when you have time? Thank you very much.

                JonBJ Online
                JonBJ Online
                JonB
                wrote on last edited by
                #13

                @NTU_WTY said in How to use Windows QT to call WSL cmd?:

                I wrote in above ways that both not recognized wsl. But if I open the cmd prompt, power shell, or MinGW terminal, they all recognize wsl.

                Then you have a problem. This is my final time of asking: copy and paste, or show me a screenshot, of precisely what you are trying in a Command Prompt. Do not tell me "they work", show me what you are trying, character for character.

                Sorry I don't know how to "hook up all signals from QProcess"

                At minimum connect a slot to void QProcess::errorOccurred(QProcess::ProcessError error):

                • Make your QProcess sh; a class member variable, at least temporarily, so it stays in scope.
                • Start with: connect(&sh, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) { qDebug() << error; }), we'll see whether we need any further ones depending on that.
                N 1 Reply Last reply
                2
                • JonBJ JonB

                  @NTU_WTY said in How to use Windows QT to call WSL cmd?:

                  I wrote in above ways that both not recognized wsl. But if I open the cmd prompt, power shell, or MinGW terminal, they all recognize wsl.

                  Then you have a problem. This is my final time of asking: copy and paste, or show me a screenshot, of precisely what you are trying in a Command Prompt. Do not tell me "they work", show me what you are trying, character for character.

                  Sorry I don't know how to "hook up all signals from QProcess"

                  At minimum connect a slot to void QProcess::errorOccurred(QProcess::ProcessError error):

                  • Make your QProcess sh; a class member variable, at least temporarily, so it stays in scope.
                  • Start with: connect(&sh, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) { qDebug() << error; }), we'll see whether we need any further ones depending on that.
                  N Offline
                  N Offline
                  NTU_WTY
                  wrote on last edited by
                  #14

                  @JonB said in How to use Windows QT to call WSL cmd?:

                  @NTU_WTY said in How to use Windows QT to call WSL cmd?:

                  I wrote in above ways that both not recognized wsl. But if I open the cmd prompt, power shell, or MinGW terminal, they all recognize wsl.

                  Then you have a problem. This is my final time of asking: copy and paste, or show me a screenshot, of precisely what you are trying in a Command Prompt. Do not tell me "they work", show me what you are trying, character for character.
                  26d6eb5d-82e2-406c-8a7f-b7a176c54895-image.png

                  JonBJ 1 Reply Last reply
                  0
                  • N NTU_WTY

                    @JonB said in How to use Windows QT to call WSL cmd?:

                    @NTU_WTY said in How to use Windows QT to call WSL cmd?:

                    I wrote in above ways that both not recognized wsl. But if I open the cmd prompt, power shell, or MinGW terminal, they all recognize wsl.

                    Then you have a problem. This is my final time of asking: copy and paste, or show me a screenshot, of precisely what you are trying in a Command Prompt. Do not tell me "they work", show me what you are trying, character for character.
                    26d6eb5d-82e2-406c-8a7f-b7a176c54895-image.png

                    JonBJ Online
                    JonBJ Online
                    JonB
                    wrote on last edited by
                    #15

                    @NTU_WTY
                    So all you have proved is that wsl ls works from that Command Prompt. Which is not the same as the command you are trying to issue from your Qt program, is it? Maybe it's wsl.exe, maybe it's not. Maybe it's in C:\Windows\System32, maybe it's not.

                    Will you please try:

                    cmd /c "C:\Windows\System32\wsl.exe ls"
                    

                    in a Command Prompt.

                    After that, try the error code I showed earlier.

                    N 1 Reply Last reply
                    0
                    • JonBJ JonB

                      @NTU_WTY
                      So all you have proved is that wsl ls works from that Command Prompt. Which is not the same as the command you are trying to issue from your Qt program, is it? Maybe it's wsl.exe, maybe it's not. Maybe it's in C:\Windows\System32, maybe it's not.

                      Will you please try:

                      cmd /c "C:\Windows\System32\wsl.exe ls"
                      

                      in a Command Prompt.

                      After that, try the error code I showed earlier.

                      N Offline
                      N Offline
                      NTU_WTY
                      wrote on last edited by
                      #16

                      @JonB
                      Sorry that I choose the wrong terminal. The following is my "C:\Windows\System32\wsl.exe" result:
                      d2d020db-c4dd-4b29-965c-15713891f333-image.png

                      If I directly type: cmd /c "C:\Windows\System32\wsl.exe ls" in the search input, the terminal will flash out (successfully show and close). So I modified to: cmd /k "C:\Windows\System32\wsl.exe ls" , it opens the terminal and lists all the files inside.
                      I also tried: cmd /k "C:\Windows\System32\wsl.exe pwd", and it returns 6073b618-8b08-4a4f-98f7-96c92f0be042-image.png,
                      where /mnt/c is the correct representation of the path C:\ in wsl.

                      About the slot, I think I need more time to digest, thank you~

                      JonBJ 1 Reply Last reply
                      0
                      • N NTU_WTY

                        @JonB
                        Sorry that I choose the wrong terminal. The following is my "C:\Windows\System32\wsl.exe" result:
                        d2d020db-c4dd-4b29-965c-15713891f333-image.png

                        If I directly type: cmd /c "C:\Windows\System32\wsl.exe ls" in the search input, the terminal will flash out (successfully show and close). So I modified to: cmd /k "C:\Windows\System32\wsl.exe ls" , it opens the terminal and lists all the files inside.
                        I also tried: cmd /k "C:\Windows\System32\wsl.exe pwd", and it returns 6073b618-8b08-4a4f-98f7-96c92f0be042-image.png,
                        where /mnt/c is the correct representation of the path C:\ in wsl.

                        About the slot, I think I need more time to digest, thank you~

                        JonBJ Online
                        JonBJ Online
                        JonB
                        wrote on last edited by
                        #17

                        @NTU_WTY said in How to use Windows QT to call WSL cmd?:

                        If I directly type: cmd /c "C:\Windows\System32\wsl.exe ls" in the search input

                        In what "search input"? The Windows desktop Start button area, or similar? I asked you to type into a Command Prompt...! Never mind, I get the gist, it looks like the full path does work, that in itself is not the issue.

                        Yes you should try the code with signal/slot I showed earlier.

                        You might also try e.g.

                        sh.start("cmd", QStringList() << "/c" << "echo Hello >> C:\\Temp\\tempfile.txt");
                        

                        Please be sensible about the path, whatever works for you. Does this work?

                        N 1 Reply Last reply
                        0
                        • JonBJ JonB

                          @NTU_WTY said in How to use Windows QT to call WSL cmd?:

                          If I directly type: cmd /c "C:\Windows\System32\wsl.exe ls" in the search input

                          In what "search input"? The Windows desktop Start button area, or similar? I asked you to type into a Command Prompt...! Never mind, I get the gist, it looks like the full path does work, that in itself is not the issue.

                          Yes you should try the code with signal/slot I showed earlier.

                          You might also try e.g.

                          sh.start("cmd", QStringList() << "/c" << "echo Hello >> C:\\Temp\\tempfile.txt");
                          

                          Please be sensible about the path, whatever works for you. Does this work?

                          N Offline
                          N Offline
                          NTU_WTY
                          wrote on last edited by
                          #18

                          @JonB said in How to use Windows QT to call WSL cmd?:

                          You might also try e.g.
                          sh.start("cmd", QStringList() << "/c" << "echo Hello >> C:\Temp\tempfile.txt");

                          Please be sensible about the path, whatever works for you. Does this work?

                          Yes! It generates tempfile and also Hello inside this file. It only fails when related to wsl.

                          I try to rewrite the code by mimicking from the doc:

                          QObject *parent;
                          QString program = "cmd";
                          QStringList arguments;
                          arguments << "/c" << "C:\\Windows\\System32\\wsl.exe" << "ls"; 
                          QProcess *sh = new QProcess(parent);
                          sh->start(program, arguments);
                          
                          connect(sh, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) { qDebug() << error; });
                          

                          It outputs this when the object is created:
                          21:17:42: C:/Users/USER/Documents/Code/Qt/build-testQT-Desktop_Qt_5_15_2_MinGW_32_bit-Debug/debug/testQT.exe crashed.
                          I'm not sure if I wrote it right. Thank you for your patience~ Please correct me and give me more hints!

                          jsulmJ 1 Reply Last reply
                          0
                          • N NTU_WTY

                            @JonB said in How to use Windows QT to call WSL cmd?:

                            You might also try e.g.
                            sh.start("cmd", QStringList() << "/c" << "echo Hello >> C:\Temp\tempfile.txt");

                            Please be sensible about the path, whatever works for you. Does this work?

                            Yes! It generates tempfile and also Hello inside this file. It only fails when related to wsl.

                            I try to rewrite the code by mimicking from the doc:

                            QObject *parent;
                            QString program = "cmd";
                            QStringList arguments;
                            arguments << "/c" << "C:\\Windows\\System32\\wsl.exe" << "ls"; 
                            QProcess *sh = new QProcess(parent);
                            sh->start(program, arguments);
                            
                            connect(sh, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) { qDebug() << error; });
                            

                            It outputs this when the object is created:
                            21:17:42: C:/Users/USER/Documents/Code/Qt/build-testQT-Desktop_Qt_5_15_2_MinGW_32_bit-Debug/debug/testQT.exe crashed.
                            I'm not sure if I wrote it right. Thank you for your patience~ Please correct me and give me more hints!

                            jsulmJ Online
                            jsulmJ Online
                            jsulm
                            Lifetime Qt Champion
                            wrote on last edited by
                            #19

                            @NTU_WTY said in How to use Windows QT to call WSL cmd?:

                            QObject *parent;

                            This is dangling pointer!
                            If you do not need a parent then pass nullptr instead!

                            QProcess *sh = new QProcess();
                            

                            If you really want a proper parent then pass a pointer to an existing (allocated) object.

                            https://forum.qt.io/topic/113070/qt-code-of-conduct

                            N 1 Reply Last reply
                            1
                            • jsulmJ jsulm

                              @NTU_WTY said in How to use Windows QT to call WSL cmd?:

                              QObject *parent;

                              This is dangling pointer!
                              If you do not need a parent then pass nullptr instead!

                              QProcess *sh = new QProcess();
                              

                              If you really want a proper parent then pass a pointer to an existing (allocated) object.

                              N Offline
                              N Offline
                              NTU_WTY
                              wrote on last edited by
                              #20

                              @jsulm said in How to use Windows QT to call WSL cmd?:

                              This is dangling pointer!
                              If you do not need a parent then pass nullptr instead!
                              QProcess *sh = new QProcess();

                              If you really want a proper parent then pass a pointer to an existing (allocated) object.

                              Thank you~ The code executed successfully without any messages after null ptr correction. So... what shall I do next to get some info from the process?

                              JonBJ 1 Reply Last reply
                              0
                              • N NTU_WTY

                                @jsulm said in How to use Windows QT to call WSL cmd?:

                                This is dangling pointer!
                                If you do not need a parent then pass nullptr instead!
                                QProcess *sh = new QProcess();

                                If you really want a proper parent then pass a pointer to an existing (allocated) object.

                                Thank you~ The code executed successfully without any messages after null ptr correction. So... what shall I do next to get some info from the process?

                                JonBJ Online
                                JonBJ Online
                                JonB
                                wrote on last edited by JonB
                                #21

                                @NTU_WTY said in How to use Windows QT to call WSL cmd?:

                                what shall I do next to get some info from the process?

                                So connect(&sh, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) { qDebug() << error; }) does not lead to any output now when you run the wsl subprocess?

                                N 1 Reply Last reply
                                0
                                • JonBJ JonB

                                  @NTU_WTY said in How to use Windows QT to call WSL cmd?:

                                  what shall I do next to get some info from the process?

                                  So connect(&sh, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) { qDebug() << error; }) does not lead to any output now when you run the wsl subprocess?

                                  N Offline
                                  N Offline
                                  NTU_WTY
                                  wrote on last edited by NTU_WTY
                                  #22

                                  @JonB said in How to use Windows QT to call WSL cmd?:

                                  So connect(&sh, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) { qDebug() << error; }) does not lead to any output now when you run the wsl subprocess?

                                  No, no output. Actually I wrote: connect(sh, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) { qDebug() << error; }); since &sh will get error.

                                  JonBJ 1 Reply Last reply
                                  0
                                  • N NTU_WTY

                                    @JonB said in How to use Windows QT to call WSL cmd?:

                                    So connect(&sh, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) { qDebug() << error; }) does not lead to any output now when you run the wsl subprocess?

                                    No, no output. Actually I wrote: connect(sh, &QProcess::errorOccurred, this, [](QProcess::ProcessError error) { qDebug() << error; }); since &sh will get error.

                                    JonBJ Online
                                    JonBJ Online
                                    JonB
                                    wrote on last edited by
                                    #23

                                    @NTU_WTY
                                    I would connect QProcess::stateChanged() next.

                                    N 1 Reply Last reply
                                    1
                                    • JonBJ JonB

                                      @NTU_WTY
                                      I would connect QProcess::stateChanged() next.

                                      N Offline
                                      N Offline
                                      NTU_WTY
                                      wrote on last edited by
                                      #24

                                      @JonB said in How to use Windows QT to call WSL cmd?:

                                      I would connect QProcess::stateChanged() next.

                                      I modified the connect line to:

                                      connect(sh, &QProcess::stateChanged, this, [](QProcess::ProcessState newState) { qDebug() << newState; });
                                      

                                      It outputs: QProcess::NotRunning

                                      JonBJ 1 Reply Last reply
                                      0
                                      • N NTU_WTY

                                        @JonB said in How to use Windows QT to call WSL cmd?:

                                        I would connect QProcess::stateChanged() next.

                                        I modified the connect line to:

                                        connect(sh, &QProcess::stateChanged, this, [](QProcess::ProcessState newState) { qDebug() << newState; });
                                        

                                        It outputs: QProcess::NotRunning

                                        JonBJ Online
                                        JonBJ Online
                                        JonB
                                        wrote on last edited by
                                        #25

                                        @NTU_WTY
                                        Have you put this connect() (indeed any/all connect()s) before your sh->start(program, arguments);? We want this signal connected and reporting before it attempts to start the program.

                                        N 1 Reply Last reply
                                        0
                                        • JonBJ JonB

                                          @NTU_WTY
                                          Have you put this connect() (indeed any/all connect()s) before your sh->start(program, arguments);? We want this signal connected and reporting before it attempts to start the program.

                                          N Offline
                                          N Offline
                                          NTU_WTY
                                          wrote on last edited by
                                          #26

                                          @JonB OK, now it outputs three lines:

                                          • QProcess::Starting
                                          • QProcess::Running
                                          • QProcess::NotRunning
                                          JonBJ 1 Reply Last reply
                                          0

                                          • Login

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • Users
                                          • Groups
                                          • Search
                                          • Get Qt Extensions
                                          • Unsolved