Técnica correta para encontrar aplicações em versões de 32 e 64 bits do Vista / Windows 7 a partir do CMD.EXE

5

ANTECEDENTES

Eu tenho um script CMD existente que funciona bem. Ele lança um aplicativo da PROGRAM FILES como assim

"%PROGRAMFILES%\MyApp\app.exe" 

PROBLEMA

  • funciona bem em versões de 32 bits do Windows (Vista, Windows 7)
  • mas nas versões de 64 bits do Windows, o aplicativo será instalado em "Arquivos de programas (x86)" e não em "Arquivos de programas" (que é o que acontece no sistema operacional de 32 bits)

O QUE ESTOU PROCURANDO

  • Um script que lida de maneira robusta com ambos os casos (ou seja, "faz a coisa certa" dependendo do sistema operacional em que está)
  • um método que usa apenas os recursos encontrados no CMD.EXE. Eu sou curioso sobre soluções que usam Powershell, etc, mas essas não me ajudam - Powershell não estará nas máquinas que este script irá rodar.
por user2666 17.05.2009 / 01:41

4 respostas

4

Semelhante a Resposta correta de Matt . Basicamente nesta versão, o caminho completo é verificado.

SET AppExePath="%ProgramFiles(x86)%\MyApp\app.exe"
IF NOT EXIST %AppExePath% SET AppExePath="%ProgramFiles%\MyApp\app.exe"
%AppExePath%
    
por 17.05.2009 / 09:57
5

Isso é o melhor que eu consegui fazer:

set strProgramFiles=%ProgramFiles%
if exist "%ProgramFiles(x86)%" set strProgramFiles=%ProgramFiles(x86)%
"%strProgramFiles%\MyApp\app.exe"
    
por 17.05.2009 / 08:23
2

Basicamente, você precisa testar a variável de ambiente ProgramFiles (x86) para determinar se você está no Windows de 64 bits ou não. Aqui está um arquivo de lote de amostra.

if "%programfiles(x86)%zzz"=="zzz" goto 32BIT
echo 64-bit Windows installed
"%PROGRAMFILES(x86)%\MyApp\app.exe"
goto END

:32BIT
echo 32-bit Windows installed
"%PROGRAMFILES%\MyApp\app.exe"

:END
    
por 17.05.2009 / 02:33
0

Outra abordagem é executar o script em cmd.exe de 32 bits, para que ele possa aproveitar o redirecionamento do sistema de arquivos WOW64 e modificações nas variáveis do ambiente . Se você puder modificar o chamador, não precisará modificar o script em questão.

Você pode até mesmo ter o script detectado quando estiver sendo executado em cmd.exe de 64 bits e reiniciar usando ocmd.exe de 32 bits%:

@echo off
if "%PROCESSOR_ARCHITECTURE%" == "x86" goto :x86
echo Restarting using Wow64 filesystem redirection: %0 %*
%SystemRoot%\SysWOW64\cmd.exe /c %0 %*
exit /b %ERRORLEVEL%

:x86
rem Rest of script follows...

Observe que errar esse hack pode resultar na geração interminável de cmd.exe processos. É por isso que usei goto e um rótulo em vez de if ... ( ... ) : os parâmetros da linha de comando podem conter parênteses e if ... ( ... ) realiza uma pesquisa gulosa para o primeiro parêntese de fechamento.

    
por 23.05.2009 / 23:03