2

I need to be able to run this batch fine on both x86 and x64 machines to check if a program has been installed correctly .

We have an app that installs in x86 in the standard program files directory, and when installed in x64 it installs in the x86 program files directory.

Currently it reports false, displays the echo that the app is installed and the echo that the app is not installed when run on x86 and x64.

if /i "%processor_architecture%"=="x86" GOTO X86DC
if /i "%processor_architecture%"=="X64" GOTO X64DC

:X86DC
if exist "C:\Program Files\installeddir\app.exe" ( echo ***App is Installed Successfully*** )
if not exist "C:\Program Files\installeddir\app.exe" ( echo ***App is not installed *** )

:X64DC
if exist "C:\Program Files(x86)\installeddir\app.exe" ( echo ***App is Installed Successfully*** )    
if not exist "C:\Program Files(x86)\installeddir\app.exe" ( echo ***App is not installed*** )

3 Answers 3

2

Wouldn't something like this be clearer? Also eliminates the issue of making assumptions about the processor_architecture variable pointed out by @MBu above.

if defined ProgramFiles(x86^) (
    set appDir=%ProgramFiles(x86^)%\installeddir
) else (
    set appDir=%ProgramFiles%\installeddir
)

if exist %appDir%\app.exe (
    echo We're installed in %appDir%. Woo hoo!
) else (
    echo Nope. Not installed.
)

Another alternative that just now occurs to me would be for your installation program or batch file to write a key to the registry with the installation location (can be done with reg.exe, a standard Windows utility). I'd be happy to flesh that solution out a bit more if you're interested.

Note: "ProgramFiles(x86^)" Closing parentheses must be Escaped or else multiline IF/FOR won't work because will wrongly finish in ")". Better always Escape it, might be within an IF in the future.

1

When run on x86, your script will execute both code blocks: for x86 and x64. You have to insert goto :eof just before :x64dc label or add another label (say :end) at the end of the script and insert goto end just before :x64dc label

Another problem is the value of %processor_architecture% variable. My machine (Windows 7 x64) returns AMD64, not X64. So in my case neither of if instructions results in a jump, so again both code blocks are executed.

See this question for a list of all possible %processor_architecture% values.

2
  • 1
    No need for :end label, there is already :eof built in. Commented Sep 4, 2013 at 7:17
  • Thanks, you are right. At the time of writing I wasn't sure if :EOF works in all circumstances. I edited my answer and included your suggestion.
    – MBu
    Commented Sep 4, 2013 at 7:38
0

Use if, else if and else constructs:

if /i "%processor_architecture%"=="x86" (
    if exist "C:\Program Files\installeddir\app.exe" (
        echo ***App is Installed Successfully***
    ) else (
        echo ***App is not installed ***
    )
) else if /i "%processor_architecture%"=="X64" (
    if exist "C:\Program Files(x86)\installeddir\app.exe" (
        echo ***App is Installed Successfully***
    ) else (
        echo ***App is not installed***
    )
)

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .