Как создать пакетный файл, который работает как для программных файлов, так и для программных файлов (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.
Ответ 2
Вот один из способов сделать это, который я скопировал из этого источника:
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."
Ответ 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