Skip to content
⌘ NSIS Forum Archive

Difference between Exec and nsExec

10 posts

mwiseman#

Difference between Exec and nsExec

Hello,

I'm trying to run an executable using nsExec. The run always ends in an error that indicates an executable-related error.

nsExec::ExecToLog '"myapp.exe"'

I can run the same executable using Exec without a problem.

Exec '"myapp.exe"'

Thinking that the environment may be the issue, I've tried:

nsExec::ExecToLog '<path_to_cmd.exe> /C "myapp.exe"'

to no avail. This problem seems to point to differences in how nsExec and Exec work but I don't know what they are. Any ideas?

Thanks,

Mike
flizebogen#
nsexec was written for command line apps. With nsexec::ExecToLog you can capture the outpu of the app and display it in the result window.
As far as i know it doesn't support live output as used by programs like rar.
Afrow UK#
Something like this should work:


!define LogFile "$INSTDIR\myapp_dump.txt"
Push $R0
ReadEnvStr $R0 COMSPEC
nsExec::Exec '$R0 /C "$INSTDIR\myapp.exe" > "${LogFile}"'
FileOpen $R0 "${LogFile}" r
LoopRead:
ClearErrors
FileRead $R0 $R1
IfErrors LoopDone
Push $R1
Call TrimNewLines
Pop $R1
DetailPrint $R1
Goto LoopRead
LoopDone:
FileClose $R0
Pop $R0
SetDetailsPrint none
Delete "${LogFile}"
SetDetailsPrint both
That would be another method of capturing the output.
Note that nsExec::Exec will run your application and hide it completely from the user (so the user will not see a command-prompt window.)

-Stu
mwiseman#
Thanks for the script but this doesn't really answer my question. I'm not looking for more error output from the nsExec run. The 'nsExec::ExecToLog' does write the errors to the result window. My question is: why would *any* command line program run to completion using:

Exec '"myapp.exe"'

but fail using:

nsExec::ExecToLog '"myapp.exe"'


I'll be more specific now: the app I'm trying to run is Microsoft's Baseline Security Analyzer utility: mbsacli.exe. The error I get seem to be network-related - 'no computer were found'.
Afrow UK#
Well, as nsExec doesn't execute your program through COMSPEC then perhaps that's why it is failing. Maybe you have to run it through COMSPEC for it to work?

-Stu
Takhir#
Windows MS DOS (console) window is a bit more complex then a process with stdin and stdout only. Simple console applications work fine with nsExec, but some apps require more - terminal emulation or something else (like telnet does). This may be a reason, Exec creates full MS DOS console window, but nsExec simply redirects IO to pipes. You can also try ExecWait with SW_HIDE.
Comm@nder21#
You can also try ExecWait with SW_HIDE.
does execwait support window state parameters like SW_HIDE ?

from the nsis docs:
command [user_var(exit code)]
as i need to run a cmd-program in a loop, i need to get the installer wait until it has finished, but also to execute it in the backround without popping up the shell window everytime.

does nsExec::Exec do this, or is it possible to use SW_HIDE with ExecWait?
Takhir#
Yes, you are right, I probably had in mind ExecShell. IMHO one of DOS-exec plug-ins is a good decision in your situation.
kichik#
It always complains about being unable to create a scan object for me. Can you attach a complete example for which you get the error you're talking about?