[wix-users] Executing Batch File

Edwin Castro egcastr at gmail.com
Thu Apr 5 09:13:22 PDT 2018


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/
>>
>


More information about the wix-users mailing list