[wpkg-users] How to define remove with logical or

Rainer Meier r.meier at wpkg.org
Thu Jan 29 20:37:32 CET 2009


Hi Stefan,

Pendl Stefan wrote:
> Hi Rainer,
>     so if one uses batch files to choose the correct installer he has to use them for the other tasks too.
> Thanks for the info.

You don't need to use the same method for install/uninstall - you could
also hard-code it in the package. However I found it much more flexible
to have a generic "installer.cmd" script which handles all common
installers generically.
Sure, the main reason was that I always forgot about the correct
switches for NSIS, MSI, Wise and others. So I wrote this installer.cmd
script. In case of MSI scripts it's very easy to uninstall as the MSI
file can be used for this.

For other installers it's usually a different procedure depending on the
program. For example I use the following script for lots of programs
which have an uninstaller within program files:

unattended-uninstall.cmd:
@echo off

echo Removing Application

set PROGRAM_FILES=%ProgramFiles%
if not "%ProgramFiles(x86)%" == "" set PROGRAM_FILES=%ProgramFiles(x86)%

start /wait "Remove" "%PROGRAM_FILES%\Program\Uninstall.exe" /S


This script supports 32-bit and 64-bit OS as well.


> BTW, I noticed that your install batch file has a spelling error in the custom installer procedure it set the exit code to ERRORLEEL (missing V) ;-)

Oh my ... ;-)
Well, custom installers are not used very widely, so you can see I am
using one of the pre-defined procedures for 99.xx% of my packages.

Anyway, thanks a lot for review, I just updated my sources!


By the way, if you have multiple languages I use a similar script as well:


unattended.cmd:
@echo off

REM Runs .\unattended-[lang].cmd according to system language.
REM Runs .\unattended-uninstall-[lang].cmd according to system language.

set INSTALL_LOC=%~dp0
set INSTALL_PREFIX=unattended
set UNINSTALL_PREFIX=unattended-uninstall
set LANG_SUFFIX=-en
set SCRIPT_SUFFIX=.cmd
set EXIT_CODE=0
set KEY="hklm\system\controlset001\control\nls\language"

REM Detect language
:select
if "%LANG%" == "en" goto en
if "%LANG%" == "enu" goto en
if "%LANG%" == "de" goto de
if "%LANG%" == "deu" goto de
goto detect

:detect
for /f "Skip=1 Tokens=3*" %%i in ('reg QUERY %KEY% /v Installlanguage')
do set language=%%i

if "%language%" == "0407" (
  set LANG=de
  goto select
)
if "%language%" == "0409" (
  set LANG=en
  goto select
)
REM if "%ProgramFiles%" == "C:\Programme" (
REM   set LANG=de
REM   goto select
REM )
REM if "%ProgramFiles%" == "C:\Programme (x86)" (
REM   set LANG=de
REM   goto select
REM )
set LANG=en
goto select

:de
set LANG_SUFFIX=-de
goto execute

:en
set LANG_SUFFIX=-en
goto execute

:execute
if "%~n0" == "%UNINSTALL_PREFIX%" goto executeUninstall
goto executeInstall

:executeInstall
call "%INSTALL_LOC%%INSTALL_PREFIX%%LANG_SUFFIX%%SCRIPT_SUFFIX%"
set EXIT_CODE=%ERRORLEVEL%
goto end

:executeUninstall
call "%INSTALL_LOC%%UNINSTALL_PREFIX%%LANG_SUFFIX%%SCRIPT_SUFFIX%"
set EXIT_CODE=%ERRORLEVEL%
goto end

:end
exit /B %EXIT_CODE%



Note: The script just executes
unattended-%LANG%.cmd (e.g. unattended-en.cmd or unattended-de.cmd)
depending on the system language. You might easily extend this script
with other languages.

Also note that the "unattended-xy.cmd" script is then identical to the
script I already posted to invoke instal.cmd with correct parameters.

This approach perfectly allows me to install different languages and
automatically detect 64-bit and 32-bit sources.

Call trace:
unattended.cmd
 |    |-> unattended-en.cmd
 |              |- install.cmd
 |                     |-> program installer
 |                         (32-bit or 64-bit depending on system)
 |-> unattended-de.cmd
           |-> install.cmd
                   |-> program installer
                       (32-bit or 64-bit depending on system)

The script above can be simply renamed to unattended-uninstall.cmd to
achieve the same for uninstall:

Call trace:
unattended-uninstall.cmd
 |    |-> unattended-uninstall-en.cmd
 |              |- install.cmd
 |                     |-> program installer
 |                         (32-bit or 64-bit depending on system)
 |-> unattended-uninstall-de.cmd
           |-> install.cmd
                   |-> program installer
                       (32-bit or 64-bit depending on system)




Some of you might find this cumbersome but it is extremely flexible
(allows all languages in 64-bit as well as 32-bit) and the scripts are
always the same (but very flexible and extensible).

This works perfectly for me since years.
In addition I like to have an "unattended.cmd" script in each program
directory. So I can copy it on a memory stick, take it to a customer and
just double-click unattended.cmd and it will automatically apply the
right version for his system (system language and architecture). Even
without WPKG.


br,
Rainer



More information about the wpkg-users mailing list