I use the latest stable version of WPKG and WPKG Client.
For InnoSetup uninstall the following method succeeds :
* create a file \\<wpkg_server>\wpkg_share\softwares\mysoft\unin.bat
which calls '"%PROGRAMFILES%\Mysoft\unin000.exe" /VERYSILENT'
* use this .bat script in <remove> section of <package>.xml
With this method exit code is =0 and unin000.exe is deleted.
Seeing that I made some other tests :
* when unin000.exe is executed via another service (to be sure it is not
a BUILTIN\SYSTEM environment side effect) => uninstall OK
* when unin000.exe is executed via a .bat script => uninstall OK
* when calling manually 'cscript wpkg.js' as Administrator (with the
same option as in WPKG Cli) => uninstall OK
* when running 'cscript wpkg.js' (with the same option as in WPKG Cli)
from another service => uninstall OK
* when executed by WPKG Client service => uninstall FAILS !
For information, my "other service" is a NT service written in Python
and using "win32process.CreateProcess(None, cmd, ...)" to execute commands.
Hope this helps to debug WPKG Client.
Rainer Meier wrote :
Hi,
On 09.12.2009 17:45, le dahut wrote:
InnoSetup says :
"""
Because Windows doesn't allow programs to delete their own EXEs, the
uninstaller creates and spawns a copy of itself in the TEMP directory.
This "clone" performs the actual uninstallation, and at the end,
terminates the original uninstaller EXE (at which point you get an exit
code back), deletes it, then displays the "uninstall complete" message box
"""
The problem is that the file "unin000.exe" is not deleted at the end of
uninstall.
I think the "exit code = 1" reflects that.
Oh, quite stupid way of doing it - from my point of view. Actually the
uninstaller could advise the OS to remove remaining files at next reboot and
return code 0 if there is only the unin000.exe running.
The side effect of this is that next time the application is installed,
it will generate an "unin001.exe" file (because a unin000.exe already
exists). And every time the app is installed/uninstalled it generates
"unin<prec_unin_number +1>.exe".
This makes next uninstall fail because "unin000.exe", as specified in
the "remove" section, is not the real uninstaller.
Uninstallation might be boxed into a small script which runs all available
unins*.exe scripts
@echo off
for /f "tokens=*" %%G in ('dir /b "%ProgramFiles%\program\unins*.exe"') DO %%G
exit /b 0
Actually I wrote another uninstall script I am using for some stupid
uninstallers which fork a sub-process...
@echo off
:: This script is an extended uninstaller script for programs which have tricky
:: uninstallers (e.g. VLC media player).
:: It is able to run an uninstaller application and then to monitor if the
:: uninstaller is erased from the system. Depending on the result (either
:: remove completes or timeout occurs) it exits with different ecit code:
:: code 0: all fine, program uninstalled
:: code 1: failed, uninstaller still exissts after timeout
:: This is required to evaluate the target of %ProgramFiles% on 64-bit systems
:: Please note that this is required only if you uninstall a 32-bit application.
set PROGRAM_FILES=%ProgramFiles%
if not "%ProgramFiles(x86)%" == "" set PROGRAM_FILES=%ProgramFiles(x86)%
:: Path where the uninstaller is located
set APP_DIR=%PROGRAM_FILES%\dia
:: Path to the uninstaller (see path definition above)
set UNINSTALLER=%APP_DIR%\dia-0.96.1-9-uninstall.exe
:: Options to be passed to the uninstaller in order to uninstall silently
set OPTIONS=/S
:: ############################################################################
:: No need to change anything below this line (usually ;-))
:: ############################################################################
echo Removing Program
if not exist "%UNINSTALLER%" goto good_end
start /wait "Uninstall" "%UNINSTALLER%" %OPTIONS%
REM Unfortunately the uninstaller seems to fork a child process and the parent
REM process exits immediately. So give it some time to uninstall
for /L %%C IN (1,1,30) DO (
if not exist "%UNINSTALLER%" goto good_end
ping -n 2 127.0.0.1 > NUL
)
:bad_end
exit /B 1
:good_end
if exist "%APP_DIR%" rmdir /s /q "%APP_DIR%"
exit /B 0
It supports 32-bit and 64-bit IS and you just need to fill the data in the
header.
Well, this will not really work if the uninstlaler referred is not removed.
But this can be extended... just an (untested) example:
@echo off
:: This script is an extended uninstaller script for programs which have tricky
:: uninstallers (e.g. VLC media player).
:: It is able to run an uninstaller application and then to monitor if the
:: uninstaller is erased from the system. Depending on the result (either
:: remove completes or timeout occurs) it exits with different ecit code:
:: code 0: all fine, program uninstalled
:: code 1: failed, uninstaller still exissts after timeout
:: This is required to evaluate the target of %ProgramFiles% on 64-bit systems
:: Please note that this is required only if you uninstall a 32-bit application.
set PROGRAM_FILES=%ProgramFiles%
if not "%ProgramFiles(x86)%" == "" set PROGRAM_FILES=%ProgramFiles(x86)%
:: Path where the uninstaller is located
set APP_DIR=%PROGRAM_FILES%\dia
:: Path to the file to be checked in order to detect if uninstall is complete
set APP_BIN=%APP_DIR%\app.exe
:: Options to be passed to the uninstaller in order to uninstall silently
set OPTIONS=/S
:: ############################################################################
:: No need to change anything below this line (usually ;-))
:: ############################################################################
echo Removing Program
if not exist "%APP_BIN%" goto good_end
for /f "tokens=*" %%G in ('dir /b "%ProgramFiles%\program\unins*.exe"') DO start
/wait "uninstall" "%%G" %OPTIONS%
for /L %%C IN (1,1,30) DO (
if not exist "%APP_BIN%" goto good_end
ping -n 2 127.0.0.1 > NUL
)
:bad_end
exit /B 1
:good_end
if exist "%APP_DIR%" rmdir /s /q "%APP_DIR%"
exit /B 0
I've written a service that runs under SYSTEM account. It succeeds in
installing/uninstalling InnoSetup apps with exactly the same command
line as in <package>.xml.
Is it possible that WPKG puts its own lock on "unin000.exe" preventing
it to be erased ?
No. WPKG just executes the processes listed in XML package definition. The only
known issue we cannot work-around is a bug in Microsoft which makes the process
to get stuck if it prints more than 4k of data to STDOUT/STDERR. So just
redirect the output to NUL by appending " > NUL" to the command if in doubt.
Make sure to use the latest WPKG version (1.1.2).
br,
Rainer
-------------------------------------------------------------------------
wpkg-users mailing list archives >> http://lists.wpkg.org/pipermail/wpkg-users/
_______________________________________________
wpkg-users mailing list
wpkg-users@lists.wpkg.org
http://lists.wpkg.org/mailman/listinfo/wpkg-users
-------------------------------------------------------------------------
wpkg-users mailing list archives >> http://lists.wpkg.org/pipermail/wpkg-users/
_______________________________________________
wpkg-users mailing list
wpkg-users@lists.wpkg.org
http://lists.wpkg.org/mailman/listinfo/wpkg-users