Показать полную графическую версию : [решено] Автоматическое определение типа ОС - 32 или 64 бит.
Возникла надобность сделать автоматическую установку приложений с автоматическим определением битности системы - 32 или 64 бит.
Пример. Запускается .bat- или .сmd-файл.
Если ОС 32-битная, то устанавливаются vcredist_2005.exe и vcredist_2008.exe.
Если ОС 64-битная, то устанавливаются vcredist_x64_2005.exe и vcredist_x64_2008.exe
Кто знает как это оформить?
Petya V4sechkin
07-06-2009, 15:44
DPavlik82, можно по наличию переменных типа ProgramW6432 (которые есть только в 64-битных системах).
If "%ProgramW6432%" Neq "" Echo Это 64-битная ОС
Petya V4sechkin, спасибо, попробую
Petya V4sechkin,
Попробовал - не помогло. Вот такая комманда (проверяется, если 64-битная, то запускается vcredist_x64_2005.exe)
If "%ProgramW6432%" Neq "" vcredist_x64_2005.exe
Запускаю указанную строчку из коммандной строки на 32-битной ХР, - все равно начинается установка vcredist_x64_2005.exe.
Если создаю cmd-файл с указанным содержимым, то вообще ничего не пытается установиться.
Вот такой вариант тоже ни к чему не приводит:
If "%ProgramW6432%" Neq "" <vcredist_x64_2005.exe> else vcredist_x86_2005.exe
Из cmd вообще никак не реагирует, а из коммандной строки на 32-битной системе тоже запускается vcredist_x64_2005.exe, еще вдобавок создается пустой файл else.
Petya V4sechkin
17-06-2009, 15:10
DPavlik82, прошу прощения, судя по этой ссылке (http://msdn.microsoft.com/en-us/library/aa384274.aspx) переменная ProgramW6432 есть только в Windows 7 и Server 2008 R2.
If "%PROCESSOR_ARCHITECTURE%"=="x86" (
Start /Wait vcredist_x86_2005.exe
) Else (
Start /Wait vcredist_x64_2005.exe
)
создаю cmd-файл
Разумеется, cmd-файл.
Petya V4sechkin, не-а, и этот вариант не отработал.
И под 32-битной ХР, и под 64-битной семеркой запускается установка vcredist_x86_2005.exe.
А на заднем плане в обоих операционках красуется окно консоли с фразой:
If "x86"=="x86" (Start /Wait vcredist_x86_2005.exe) Else (Start /Wait vcredist_x64_2005.exe)
Petya V4sechkin
18-06-2009, 10:12
DPavlik82, выложите результаты выполнения команды Set.
IF EXIST "%ProgramFiles(x86)%" (ОС 64-битная, а проверяемая папка для 32-х битных программ)
Devils0411
28-06-2009, 21:19
Встала такая же ситуация. Сделал код вот так:
If exist "%programfiles(x86)% (
start /wait "%programfiles(x86)%\tftpd32\unins000.exe /Silent"
) else (
start /wait "%programfiles%\tftpd32\unins000.exe /Silent"
)
Не проверяет. Т.е. приложение не запускается.
Видимо прикол состоит в том, что если запускать этот bat- Или cmd- файл из-под 32-битного FAR в 64-битной системе, то переменная PROCESSOR_ARCHITECTURE имеет значение "x86", так как FAR-то 32-битный :)
Devils0411
28-06-2009, 22:04
oszip, Кому адрессовано это сообщение? И причем здесь FAR? В данном топике я вообще не вижу упоминания FAR'а
Devils0411, очепятка вкралась, когда сюда копировали, или такой же bat-ник запускали?
If exist "%programfiles(x86)%" (
Devils0411
29-06-2009, 00:11
Litstat, пробывал по-разному . И с ковычками и без. Толку ни какого. Батник запускается и через время открывает еще одно окно и оно весит, но не в прямом смысле. В нем можно вводить команды.
Dmitry_K
29-06-2009, 00:54
Litstat, пробывал по-разному . И с ковычками и без. Толку ни какого. Батник запускается и через время открывает еще одно окно и оно весит, но не в прямом смысле. В нем можно вводить команды. »
все правильно, потому что просто переменной %programfiles(x86)% в 32-битной системе не существует (все переменные можно посмотреть командой set, введя ее консольном окне или перенаправить вывод в файл командой cmd /c set > %systemdrive%\set.txt), что и попросил сделать DPavlik82, выложите результаты выполнения команды Set. »
и в приведенной им ссылке написаны условия создания переменных (над таблицей) When a 32-bit process is created by a 64-bit process, or when a 64-bit process is created by a 32-bit process, WOW64 sets the environment variables for the created process as shown in the following table.
Когда 32-битный процесс создан 64-битным процессом или когда 64-битный процесс создан 32-битным процессом, WOW64 устанавливает переменные окружения для созданного процесса, как приведено в следующей таблице...
Devils0411
29-06-2009, 01:16
переменной %programfiles(x86)% в 32-битной системе не существует »
это понятно. Но с чего вы взяли что я запускаю батник на 32-битной системе? Мне нужно чтоб если батник (Не зависимо от того, в какой ОС он запускается) не находит папку %programfiles(x86)%, а значит батник запускает из под 32-битной системы, то переходил к следующей команде. А если находит, соответственно выполняет необходимую команду (значит запущен из под 64-битной системы.
ALLUSERSPROFILE=C:\Documents and Settings\All Users
APPDATA=C:\Documents and Settings\Ђ¤¬Ё*Ёбва*в®а\Application Data
ClusterLog=C:\WINDOWS\Cluster\cluster.log
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
ComSpec=C:\WINDOWS\system32\cmd.exe
DEVMGR_SHOW_DETAILS=
DEVMGR_SHOW_NONPRESENT_DEVICES=1
FP_NO_HOST_CHECK=NO
HOMEDRIVE=D:
NUMBER_OF_PROCESSORS=2
OS=Windows_NT
Path=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\system32\WindowsPowerShell\v 1.0;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.PSC1
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=EM64T Family 15 Model 4 Stepping 9, GenuineIntel
PROCESSOR_LEVEL=15
PROCESSOR_REVISION=0409
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
PROMPT=$P$G
SESSIONNAME=RDP-Tcp#1
SystemDrive=C:
SystemRoot=C:\WINDOWS
TEMP=C:\WINDOWS\TEMP\1
TMP=C:\WINDOWS\TEMP\1
USERNAME=Ђ¤¬Ё*Ёбва*в®а
USERPROFILE=C:\Documents and Settings\Ђ¤¬Ё*Ёбва*в®а
windir=C:\WINDOWS
Да и кстати, если я правильно понимаю, то PROCESSOR_ARCHITECTURE=AMD64 всегда будет равнятся этому значению. если соответственно процессор подерживает 64 разряда.
Попробовал, все работает. У меня 64х-битная система. На обычной тоже работать будет, но при проверке переменной %ProgramFiles(x86)% нужно ELSE добавить.
В C:\Program Files (x86)\ создал батник pf32.bat:
@ECHO off
ECHO Hello! I'm 32-bit directory. My options is %*
pause >> nul
В другой папке на другом диске создал запускающий батник:
@ECHO off
IF EXIST "%ProgramFiles(x86)%" (
start /wait /D "%ProgramFiles(x86)%" pf32.bat /silent
start "Uninstalling DMaster..." /wait "%ProgramFiles(x86)%\Download Master\unins000.exe" /silent
)
pause >> nul
1) Первый start запускает батник pf32.bat: он выполнился в новой консоли и выдал: Hello! I'm 32-bit directory. My options is /silent
2) Второй start - удаление программы. В данном случае после "start" нужно задать в кавычках заголовок нового окна (к примеру, "Uninstalling DMaster..."), иначе этот "start" примет за него все то в кавычках, что после /wait. Поэтому запускать и не получалось - у вас, Devils0411, выскакивала пустая консоль с именем "%programfiles(x86)%\tftpd32\unins000.exe /Silent", можете проверить.
3) Можно экзешники запускать и без "start", работает:
"%ProgramFiles(x86)%\Download Master\unins000.exe" /silent
4) Dmitry_K, то, что переменной не существует, еще не значит, что не будет работать батник. Условие типа: IF EXIST "%abracadabra%" ECHO abacadabra - отрабатывает верно, т.е. в консоль ничего не выведено. Если же ввести что-то осмысленное: IF EXIST "%ProgramFiles%" ECHO %ProgramFiles% - то в консоли увидим путь к программам.
можно попробывать вариант
Код:
if exist "%systemdrive%\Program Files (x86)" »
А если програм файлс перемещены на несистемный раздел?
Devils0411
29-06-2009, 01:44
Litstat, Заработало. Единственное запускал на 64-битной оси. На 32-битной проверить не могу. На ноуте, на сервере, и на настольнике стоят 64-битные оси :)
Кому интересно вот код.
IF EXIST "%ProgramFiles(x86)%" (
start "Uninstalling tftpd Server..." /wait "%programfiles(x86)%\tftpd32\unins000.exe" /silent
) else ( start /wait "%programfiles%\tftpd32\unins000.exe" /silent
)
Dmitry_K, а зачем усложнять жизнь? if exist "%systemdrive%\Program Files (x86)" »
А если програм файлс перемещены на несистемный раздел? » Согласен. Всякое ведь может быть.
Всем большое спасибо за помощь. Буду дальше дорабатывать свой проект :)
Кому интересно вот код.
Код:
IF EXIST "%ProgramFiles(x86)%" (
start "Uninstalling tftpd Server..." /wait "%programfiles(x86)%\tftpd32\unins000.exe" /silent
) else ( start /wait "%programfiles%\tftpd32\unins000.exe" /silent
) »
Для IF исправили, а для ELSE нет :gamer:
IF EXIST "%ProgramFiles(x86)%" (
start "Uninstalling tftpd Server..." /wait "%programfiles(x86)%\tftpd32\unins000.exe" /silent
) else (
start "Uninstalling tftpd Server..." /wait "%programfiles%\tftpd32\unins000.exe" /silent
)
Devils0411
29-06-2009, 01:57
Litstat, верно. Если бы запустил на 32-битной оси, то выдал бы ошибку.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.