Назад | Перейти на главную страницу

Правильный способ поиска приложения в 32- и 64-битных версиях Vista / Windows 7 из CMD.EXE

ЗАДНИЙ ПЛАН

У меня есть существующий сценарий CMD, который отлично работает. Он запускает приложение из ФАЙЛОВ ПРОГРАММЫ, например

"%PROGRAMFILES%\MyApp\app.exe" 

ПРОБЛЕМА

ЧТО Я ИЩУ

Это лучшее, что я мог придумать:

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

Похожий на Правильный ответ Мэтта. В основном в этой версии проверяется полный путь.

SET AppExePath="%ProgramFiles(x86)%\MyApp\app.exe"
IF NOT EXIST %AppExePath% SET AppExePath="%ProgramFiles%\MyApp\app.exe"
%AppExePath%

По сути, вам нужно проверить переменную среды ProgramFiles (x86), чтобы определить, используете ли вы 64-битную Windows или нет. Вот пример командного файла.

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

Другой подход - запустить скрипт под 32-битной cmd.exe, чтобы он мог воспользоваться перенаправлением файловой системы WOW64 и модификации переменных окружения. Если вы можете изменить вызывающего абонента, вам даже не придется изменять рассматриваемый сценарий.

Вы даже можете заставить скрипт определять, когда он выполняется под 64-битной cmd.exe и перезапустите себя, используя 32-битный 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...

Обратите внимание, что неправильный взлом может привести к бесконечному появлению cmd.exe процессы. Вот почему я использовал goto и ярлык вместо if ... ( ... ): параметры командной строки могут содержать круглые скобки и if ... ( ... ) выполняет жадный поиск первой закрывающей скобки.