[wix-users] Executing Batch File

Ven H venh.123 at gmail.com
Fri Apr 6 10:43:41 PDT 2018


Also, for a Builtin Deferred Custom Action which has a ExeCommand
attribute, how can we ensure it doesn't pop up console window?

Regards,
Venkatesh

On Thu, Apr 5, 2018 at 9:43 PM, Edwin Castro via wix-users <
wix-users at lists.wixtoolset.org> wrote:

> I have found the Saw Tooth Diagram described at
>
> https://blogs.msdn.microsoft.com/rflaming/2006/09/21/uac-
> in-msi-notes-the-saw-tooth-diagram/
>
> indispensable for understanding how the Windows Installer engine works.
>
> --
> Edwin G. Castro
>
>
> On Thu, Apr 5, 2018 at 7:13 AM, Edwin Castro <egcastr at gmail.com> wrote:
>
> > The documentation describing how to reference the full path to a file
> > getting installed is at
> >
> > https://msdn.microsoft.com/en-us/library/windows/desktop/aa368609.aspx
> >
> > The WiX documentation doesn't cover this because it is a Windows
> Installer
> > concept. To be fair, the WiX documentation should probably have links to
> it
> > so that newbies can find it easier.
> >
> > The Windows Installer logically performs multiple passes of the
> > InstallExecuteSequence. In the first "pass", only immediate mode custom
> > actions are executed (with full access to tables and properties) and an
> > execute script is generated. The second "pass" occurs when the generated
> > execute script is executed when deferred custom actions are executed
> (with
> > access only to custom action data and a very limited number of
> properties).
> > The third "pass" only executes if a deferred action fails. In this last
> > pass, the generated execute script is executed in reverse starting from
> the
> > action prior to the action that failed but only rollback actions are
> > executed.
> >
> > The purpose if the first "pass" is to make decisions on what actions
> > should be taken. The second "pass" actually modifies the target system.
> And
> > the third "pass" rollsback in case of failure.
> >
> > Your WixQuietExec action for running bcpImp.bat must be deferred (runs in
> > the second pass). The SetProperty for the command line implements an
> > immediate custom action (first pass) to set the custom action data for
> the
> > deferred action. You'll need to consider what should happen, if anything,
> > during rollback in the third pass (if you need a rollback action it must
> be
> > scheduled before your deferred action).
> >
> > One consequence of all this is that you cannot communicate between
> > deferred actions!! Since you want the return code only to determine if it
> > succeded then you can simply set Return="check" on the CustomAction
> element
> > as per the WiX documentation. This ensures that the Windows Installer
> waits
> > for the deferred action to complete (it runs synchronously) and checks
> the
> > return code to be zero indicating success. With this you just need to
> > schedule the follow up scripts/commands after this one and the later ones
> > only get executed if the previous ones succeeded.
> >
> > Additionally, if and only if, your .bat script only executes a single
> > command, then you can use WixQuietExec to run the command directly
> instead
> > of using the .bat script. Obviously, if your .bat script runs multiple
> > commands, then you'll definitely want to use the .bat script. Just ensure
> > the .bat only returns a zero exit code on success and non-zero on
> failure.
> >
> > --
> > Edwin G. Castro
> >
> >
> >
> > On Thu, Apr 5, 2018, 05:38 Joel McBeth via wix-users <
> > wix-users at lists.wixtoolset.org> wrote:
> >
> >> Here is the documentation for using the Execution custom action:
> >> http://wixtoolset.org/documentation/manual/v3/customactions/qtexec.html
> >>
> >> CAQuietExec is being depreciated for WixQuietExec. You don't use
> >> ExeCommand with WixQuietExec. I would look at the examples in the link
> >> above.
> >>
> >> Also a tip, if you are installing bcpimp.bat you can directly reference
> >> the file by ID. I couldn't quickly find the documentation on this with a
> >> good example, but check out this stack overflow:
> >> https://stackoverflow.com/questions/9664652/how-do-i-
> >> reference-the-installed-path-of-a-file-in-a-registry-value
> >>
> >> Although that might all be pointless as I don't think you can capture
> the
> >> output of WixQuietExec, and if you could I'm not sure you could easily
> >> parse it without a custom action.  That being said, you should probably
> >> just write your own custom action to do all of this instead of using
> >> WixQuietExec.
> >>
> >> For point 3, you can probably schedule the BCP custom action to run
> >> before the SQL scripts are installed.
> >>
> >> -----Original Message-----
> >> From: wix-users [mailto:wix-users-bounces at lists.wixtoolset.org] On
> >> Behalf Of Ven H via wix-users
> >> Sent: Thursday, April 5, 2018 3:34
> >> To: WiX Toolset Users Mailing List <wix-users at lists.wixtoolset.org>
> >> Cc: Ven H <venh.123 at gmail.com>
> >> Subject: [wix-users] Executing Batch File
> >>
> >> I am trying to execute a batch file through my MSI. I am using the
> >> BuiltIn Custom Action with the following code. The batch file is meant
> for
> >> BCP.
> >> Hence I am passing the arguments to the command using properties, as
> >> given below in Product.wxs
> >>
> >> <CustomAction Id="test" ExeCommand="[INSTALLFOLDER]bcpImp.bat
> >> "[SQLSERVER]\[SQLINSTANCE]"  "[SQLUSER]"
> >> "[SQLPASSWORD]"  "[SQLDB]"  "[SQLTABLE]"
> >> "[BCPIMPFILE]"" Execute="deferred" Return="check"
> >> Directory="INSTALLFOLDER"  />
> >>
> >> <InstallExecuteSequence>
> >>       <Custom Action="test" After="InstallFiles">NOT Installed</Custom>
> >>     </InstallExecuteSequence>
> >>
> >> This works fine and the data gets imported. But I have a couple of
> issues.
> >>
> >> 1. During execution, it pops up a Console Window. To suppress it, if I
> >> use DllEntry="CAQuietExec", I get an error that "The CustomAction
> element
> >> may only have one of the following target attributes specified at a
> time."
> >> So, I cannot have DllEntry and ExeCommand specified at the same time in
> my
> >> CustomAction element. Hence I am not able to execute the BCP command
> >> quietly. Is this achievable?
> >>
> >> 2. To understand whether the custom action executed successfully and to
> >> capture it's return value, I tried assigning a Property. In that case I
> had
> >> to remove the Directory attribute, otherwise, it was not getting
> compiled.
> >> But, I got a runtime exception "A program required for this install
> could
> >> not be run.". So I am not sure how to read the return value. I need this
> >> because, I want to execute some more SQL scripts, after the data is
> >> imported through BCP. So, I want to check if the BCP import ran
> >> successfully, then accordingly, I want to execute more sql scripts. Is
> this
> >> possible?
> >>
> >> 3. To reiterate the second part of the above issue, I would like to
> >> execute some sql scripts after the execution of the custom action. Is
> this
> >> possible? If yes, how?
> >>
> >> Please help.
> >>
> >> ____________________________________________________________________
> >> WiX Toolset Users Mailing List provided by FireGiant
> >> http://www.firegiant.com/
> >>
> >> ____________________________________________________________________
> >> WiX Toolset Users Mailing List provided by FireGiant
> >> http://www.firegiant.com/
> >>
> >
>
> ____________________________________________________________________
> WiX Toolset Users Mailing List provided by FireGiant
> http://www.firegiant.com/
>


More information about the wix-users mailing list