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

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

Это моя партия script -

C:\PROGRA ~ 2\JASPER ~ 1.0\mysql\bin\mysql.exe -u root -proot < create_database.sql

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

Ответ 1

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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)

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

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

Ответ 5

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

GOTO %PROCESSOR_ARCHITECTURE%

:AMD64
<64Bit code>
EXIT

:X86
<32bit code>
EXIT

Ответ 6

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

@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