Как создать пакетный файл, который работает как для Program Files, так и для Program Files(x86)?

Я создал пакетный файл, который автоматически копирует a .sql файл к пути установленного сервера Jasper (это может быть любой каталог установки программного обеспечения).

Это мой пакетный скрипт--

C:PROGRA~2яшма~1.0MySQL в папкуbinMySQL-сервера.exe-u root-proot

это работает, когда jasper установлен в Program Files(x86). Как я могу обобщить его для программных файлов и программных файлов (x86).

6 ответов


вы хотите использовать переменные среды для поиска таких вещей. На 32-битных окнах,%ProgramFiles% - твой друг.

на 64bit Windows, все немного сложнее, так как приложение может быть установлено как в %ProgramFiles% и %ProgramFiles(x86)%.

Если вы не можете найти местоположение Jasper каким-либо другим способом (реестр? установленные настройки программы?), лучше всего искать в обоих местах и взять тот, где вы найдете ожидаемый каталог.

редактировать Видел nsis tag-вы создаете установщик? В этом случае константа $ProgramFiles могут быть полезны.


вот один из способов сделать это, который я скопировал из этого источника: http://social.msdn.microsoft.com/Forums/zh/winforms/thread/69dc2aac-9956-40a0-9826-da48b9003a8e

SET ProgFiles86Root=%ProgramFiles(x86)%
IF NOT "%ProgFiles86Root%"=="" GOTO win64
SET ProgFiles86Root=%ProgramFiles%
:win64

"%ProgFiles86Root%\name of program" "arguments, etc."

в NSIS вы можете просто притвориться, что x64 не существует, и просто использовать $programfiles

в пакетном файле; если %ProgramFiles (x86)% определено, тогда вы можете предположить, что вы находитесь в 64-разрядной системе, и что %ProgramFiles(x86)% является 32-разрядной папкой, а %ProgramFiles% - 64-разрядной папкой. Вы также можете проверить PROCESSOR_*:PROCESSOR_ARCHITEW6432 определяется для 32-разрядного пакетного файла, работающего в 64-разрядной системе. Окно-это amd64 для себя x86-64 / amd64 бит пакетный файл (помните, что PROCESSOR_ARCHITECTURE не только x86 или AMD64, есть также IA64 и для NT4 еще больше значений)

вы также должны иметь в виду, что переменные могут быть изменены пользователем или могут вообще не существовать, поэтому, если вы генерируете пакет с NSIS, вероятно, лучше использовать полные пути, которые дает вам NSIS...


Как насчет чего-то простого, как,

if exist "C:\Program Files (x86)" goto 64bit

goto 32bit

:32bit

(whatever u want to happen for the 32bit system)

:64bit

(whatever u want to happen for the 64bit system)

У меня есть такой скрипт, и он отлично работает для обеих систем.

извините за двойной интервал, он не хотел сохранить правильный формат.


вот как я делаю это:

GOTO %PROCESSOR_ARCHITECTURE%

:AMD64
<64Bit code>
EXIT

:X86
<32bit code>
EXIT

похоже, что ответ @RenniePet хорош. В качестве альтернативы вот как я это сделал. Не слишком эффективно и вместе взятые из ответов здесь, в основном из ответа @Самуила. В этом решении полагаются только на структуру каталогов: нет ссылочных переменных среды.

@echo off
dir "C:\Program Files (x86)\." > NUL 2>&1
if errorlevel 0 (
    set PROGRAMS_HOME="C:\Program Files (x86)"
    GOTO HomeSet
)
dir "C:\Program Files\." > NUL 2>&1
if errorlevel 0 (
    set PROGRAMS_HOME="C:\Program Files"
    GOTO HomeSet
)   
GOTO NotWindows
:HomeSet
set PROGRAMS_HOME=%PROGRAMS_HOME:"=%
echo PROGRAMS_HOME set to *%PROGRAMS_HOME%*
:NotWindows