ti-enxame.com

Técnica correta para encontrar aplicação em versões de 32 e 64 bits do Vista / Windows 7 de cmd.exe

FUNDO

Eu tenho um script cmd existente que funciona bem. Ele lança um aplicativo de arquivos de programa como

"%PROGRAMFILES%\MyApp\app.exe" 

PROBLEMA

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

O que estou procurando

  • Um script que lida com robustos ambos os casos (isto é, "a coisa certa", dependendo do sistema operacional está ligado)
  • um método que usa apenas os recursos encontrados no CMD.EXE. I AM Curioso sobre soluções que usam o PowerShell, etc, mas aqueles não me ajudam - PowerShell não estará nas máquinas que esse script será executado.
5
user2666

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%
4
splattne

Este é o melhor que eu poderia inventar:

set strProgramFiles=%ProgramFiles%
if exist "%ProgramFiles(x86)%" set strProgramFiles=%ProgramFiles(x86)%
"%strProgramFiles%\MyApp\app.exe"
5
Matt Hanson

Basicamente, você precisa testar para a variável de ambiente ProgramFiles (x86) para determinar se você está em 64 bits ou não. Aqui está um arquivo de lotes 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
2
Joe Doyle

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

Você pode até mesmo ter o script detectar quando ele estiver sendo executado sob o cmd.exe e reiniciar-se usando o cmd.exe:

@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...

Note que a obtenção deste hack errado pode resultar em desovar interminável cmd.exe Processos. É por isso que usei goto e uma etiqueta em vez de if ... ( ... ): Os parâmetros da linha de comando podem conter parênteses e if ... ( ... ) realiza uma pesquisa gananciosa para o primeiro parêntese de fechamento.

0
bk1e