![]() |
[решено] Как проверить разрядность операционной системы?
Как проверить разрядность операционной системы?
У виндоуз 7 есть 2 версии: 64-х разрядная и 32-х разрядная. Для 64-х разрядной нужно, чтобы выполнялись дополнительные программы. Как это сделать в коммандом файле? |
в реестре ветки добавляются у 64-х, но как проверить?
|
Код:
@Echo Off |
Так покороче:
Код:
set xOS=x86 |
PATH %PATH%;q:;w:;e:;r:;t:;y:;u:;i:;o:;p:;a:;s:;d:;f:;g:;h:;j:;k:;l:;z:\;x:;c:;v:;b:;n:;m:;
"%WINDIR%\regedit.exe" /s 32x.reg Set xOS=x86 If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64 if "%xOS%"=="x64" "%WINDIR%\regedit.exe" /s 64x.reg в реестр ничего не добавляет, а если убрать /s то предлагает добавить в реестр, что требует действия пользователя, что неудобно. Как убрать запрос? 64x.reg находится на сетевом диске z:\ |
SvoiLudi, на форуме
Цитата:
|
Извините, если не в тему, но не получается корректно обработать запуск программы в зависимости от разрядности системы
Пример: PHP код:
В данном скрипте почему-то съедается скобка в пути у Programm Files (x86 |
Цитата:
Код:
@ECHO OFF |
Цитата:
всё как и положено, а вот на x64 Выдёт всё равно путь и имя файла как для системы x86 (Program Files (x86) и wrar420b3ru.exe) Такое ощущение, что условие ELSE срабатывает в любом случае Пока делаю костыль с добавлением GoTo |
Тогда так:
Код:
@ECHO OFF |
День добрый! Подскажите как на основе выше приведенного примера запустить программу driver install.ехе исходя из розрядности из папки х86 или х64?
|
Цитата:
Код:
Set xOS=x86 |
Цитата:
|
Работает но есть одно но, driver install.ехе скомпилирован из *.bat и этот батник запускается и запускает driver install.ехе как бы внутри себя и команды из driver install.ехе не выполняются. За исключением одной
Код:
@var WSHShell = WScript.CreateObject( "WScript.Shell" ); > %temp%\mes.js |
Цитата:
|
Цитата:
|
Цитата:
Все верно, автор спрашивал как раз то, что нужно Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Код:
Set xOS=x86 Парни скажите можно это исправить? А то очень нехочется лепить сложный инсталятор :( |
Какая-то ерунда снова получается. В прошлый раз не всё проверил.
Имеется батник: Код:
@ECHO OFF Если запускать на x64, то появляется ошибка: Непредвиденное появление: \AIMP ![]() |
vcrank, а так?
Код:
@ECHO OFF |
gora,
Цитата:
|
Цитата:
Продолжу вопрос здесь. Привет. Кто подскажет как запустить setup.exe в соответствии с разрядностью системы? Код по проще можно? Нужен только запуск. Например Код:
@ echo |
L1nk3R, а посмотреть на код gora парой постов выше и проявить смекалку сложно?
Код:
SET xOS=x86 |
sov44, я в батнике мало что понимаю.
Данная тема соответствует больше вот этому примеру: Код:
@echo off |
Цитата:
|
sov44, Спасибо добрый человек за помощь! Всё работает :).
|
Запуск x86 x64
Всем участникам форума респект!!!
Ближе к делу! Батник должон , определить разрядность ОС, и запустить надлежащий EXE(или MSI), с параметром К примеру : x86 setup_x86.exe /S или x64 setup_x64.msi /qn Заранее спасибо!!! |
gen0m.rsw, попробуй как-то так:
Код:
@echo off |
Ещё один, более короткий, вариант записи определения разрядности, предложенной в посте 3.
Код:
Set xOS=x64 |
А я так:
Код:
Set xOS=x86 |
Код:
Set xOS=x86 If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64 Код:
copy "test.exe" "%systemroot%\system32\test.exe" /y |
Цитата:
|
Батник который определяет разрядность системы x86 или x64
Привет, мне нужен батник который определяет разрядность системы x86 или x64 если система 32 битная, то есть x86 то тогда нужно запустить файл 1.exe если система 64 битная то есть x64 тогда нужно запустить файл 2.exe
Кто может подскажите варианты такого батника пожалуйста. |
Код:
@echo off |
Спасибо zion87!
|
2ALL
Код:
@Echo Off |
Цитата:
Код:
If "%PROCESSOR_ARCHITECTURE%"=="x86" Goto Install_x86 Код:
SetLocal EnableDelayedExpansion Это скорее определение среды запуска скрипта, нежели разрядности ОС. |
gora, есть еще такой прием:
Код:
@Echo off |
Цитата:
1 SystemInfo отрабатывает достаточно долго, что вызовет общую задержку в работе скрипта. 2 Посмотрите внимательно вывод SystemInfo, Вы обнаружите в нем несколько строк, которые задаются пользователем, например: Код:
Имя узла: GORA-ПК |
gora, ну так-то оно так :happy: вот только сам пользователь знал бы еще об этом...
хорошо, не спорю, ваша взяла))) тогда вопрос: определить архитектуру пк и запустить соответствующие приложения, можно как-то уместить в одну строку? ..буду признателен! |
Код:
Set xOS=x64& (If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86)& Call start "" /wait msiexec /i"%~dp0setup-%%xOS%%.msi" /quiet /norestart |
gora, отлично, спасибо!
небольшая поправка: Код:
Set xOS=x64& (If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x86)& Call start "" /wait msiexec /i"%~dp0\setup-%%xOS%%.msi" /quiet /norestart |
Цитата:
Цитата:
для х86 файл - 32-bit\install.msi для x64 файл - AMD64\setup.msi Код:
Set xOS=AMD64\setup.msi& (If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=32-bit\install.msi)& Call start "" /wait msiexec /i"%~dp0%%xOS%%" /quiet /norestart |
Цитата:
Цитата:
Код:
Set xOS=AMD64\setup.msi& (If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=32-bit\install.msi)& Call start "" /wait msiexec /i"%~dp0%%xOS%%" /quiet /norestart - cdbxp_setup_x86_4.5.0.3717.msi - cdbxp_setup_x64_4.5.0.3717.msi при запуске из другого интерпретатора определит битность ОС и выполнит соответствующие приложение, определив в имени файла переменную "x64 или x86"? |
Цитата:
Цитата:
Цитата:
|
gora, дабы не офтопить ответил в пм
|
gora, подскажите, возможно ли объединить в один пакетный файл определение сразу нескольких параметров и исходя из этого выполнять ту или иную задачу, а именно: определение версии/разрядности ОС'ь
интересует именно определение ОС: 7 или 8 и их разрядность |
Код:
@Echo Off |
Вложений: 1
gora, прошу прощения, я немного не так выразился, требуется что-то на подобие такой структуры:
|
Так?
Код:
@Echo Off |
gora, да, это то что нужно. Премного благодарен.
У меня еще один вопрос к вам, понимаю что не в этой теме, да простят меня боги)) Возможно ли как-то заставить команду robocopy отображать только процент копирования в окне пакетного файла? Заранее спасибо! |
Сделал так все работает ! А как правильно прописать файл конфигурации в Модифицированном SFX модуле 7-Zip ?
@echo off Set xOS=x86 If Defined PROCESSOR_ARCHITEW6432 (Set xOS=x64) Else If "%PROCESSOR_ARCHITECTURE%"=="AMD64" Set xOS=x64 IF %xOS%==x86 ( "setup_x86.exe" /S) else ( "setup_x64.exe" /S) pause exit |
Survover, для таких вопросов есть ветка: .: Файлы конфигурации 7z SFX. Помощь и советы :.
Код:
RunProgram="%%P:hidcon:cmd /c setup_%%P.exe &Pause" |
Спс
|
Ребят подскажите, а как закрыть окно cmd?
что только не пробовал, и пауза выход и просто выход и эхо. Запуская программу с сетевой папки - Mem_Reduct, нужно самому закрывать cmd или же нажимать выход в программе и тогда командная строка закрывается |
С определением разрядности ОС всё оказалось как-то запутанно и неопределённо. Например, в моей Win 10 x64 переменная "PROCESSOR_ARCHITECTURE" имеет значение "AMD64", а "PROCESSOR_ARCHITEW6432" не определена. Может, вместо второй использовать переменную "ProgramW6432"? В общем, вот, что я нашёл по этому вопросу (комментарий одного из пользователей одного ресурса):
Скрытый текст
Код:
@echo off |
по обеим переменным и определяется:
Cmd: Код:
rem Определение разрядности системы Код:
function Get-OsArch { Powershell: Код:
function Get-OsVers { |
Цитата:
Код:
>nul 2>&1 set ProgramFiles(x86)&&set xOS=x64||set xOS=x86 |
Цитата:
Цитата:
Код:
[Runtime.InteropServices.Marshal]::ReadInt16([IntPtr]0x7FFE026A) Что касается ещё более низкого уровня - лучше смотреть в сторону сегментных регистров. |
Ещё есть вот такая команда, но я не знаю, как её в cmd обработать:
Код:
wmic os get osarchitecture Код:
if ((gwmi win32_operatingsystem).osarchitecture -match "64") { |
Цитата:
Код:
wmic os get osarchitecture | sed "s/[^0-9*]//g;/[[:digit:]]/!d" Цитата:
|
Цитата:
|
Iska, только вот кто в здравом уме станет запускать 32-битный командный шелл (из SysWOW64) в 64-битной ОС? Кто бы что ни говорил, а идеологически верным будет спросить у KUSER_SHARED_DATA нужные данные.
|
Цитата:
Цитата:
потому как pwsh выдает по [Runtime.InteropServices.Marshal]::ReadInt16([IntPtr]0x7FFE026A) именно: 0 а systeminfo это: Код:
Система вопрос чему верить не задаю, так как windows ставил я сам и склерозом не страдаю поэтому знаю какой разрядности ОС. |
Цитата:
|
Вспомнился анекдот "в гамаке и стоя".
|
Цитата:
во-первых для 7-ки я вряд ли уже что-то скачаю во-вторых даже если и был бы не стану лезть в такие дебри в-третьих (Такое поведение характерно для крякнутых систем) да, ОС не лицензия, хоть и не левая сборка но почему это все должно влиять на то что при достаточно большом числе запусков одними инструментами я получаю ожидаемый результат, а другим инструментом нет. Пусть я поверю что этот другой инструмент будет гарантированно стабильно работать только на лицензии, но ситуация есть как есть и нужен результат именно на этой системе и соответствующий действительности для данных условий. Другие инструменты позволяют это делать. Подозреваю что и на лицензии отработают точно так же. Тут назревает вопрос, а стоит ли напрягаться, оно надо? |
Благодарю всех за ответы. Всё же остался вопрос по самой переменной %PROCESSOR_ARCHITECTURE%. Правильно ли я понимаю, что она определяет только архитектуру CPU (меня в данном случает интересует только разрядность), а не разрядность ОС? Это конечно, редкость, но и на x64 железо может быть установлена x32 ОС.
|
Цитата:
Цитата:
Цитата:
WOW64 Implementation Details - Win32 apps | Microsoft Docs Detect 64 vs 32 bit OS or Process - Windows CMD - SS64.com |
Забавно, зачем же разработчики так назвали переменную %PROCESSOR_ARCHITECTURE%, если её значение зависит от условий, в которых она запущена? Вот об это я изначально и споткнулся.
|
Andrey_Vladimirovich, видимо решили, что она должна отражать состояние для окружения именно текущего процесса. А потом оставили, вероятно — чтобы не ломать совместимость. Изначально-то ни о каких x64 процессорах речь не шла — были Intel x86, MIPS, Alpha и PowerPC. И проверка была банальная (причём, я веду речь не только о пакетных файлах):
Код:
IF %PROCESSOR_ARCHITECTURE% == x86 (…) |
Iska
согласен, что оставили для совместимости. Но изначально было принято не правильное решение. Ведь само название переменной %PROCESSOR_ARCHITECTURE% говорит об архитектуре процессора, либо я не правильно понимаю, что имеется в виду под словом "PROCESSOR" в данном контексте. Поправьте меня, если я не прав. А если прав, то очевидно, что ОС никак не может влиять на процессор. Максимум, что может, так это изменить микропрограмму (если такая имеется) и то, это, например, изменит логику работы процессора, но не его разрядность. И если сходить по ссылке в сообщении 61 написанном greg zakharov, то, как он и указал, написано "The processor architecture of the installed operating system.". Правда, сам он почему-то сделал иной вывод из написанного. Я понимаю, что так сделал разработчик и понимать это нужно так, как это работает, но логики в этом нет. Либо я в упор чего-то не вижу и/или не понимаю. |
Andrey_Vladimirovich, видимо, это просто костыль с древних времён, который никто не будет уже менять. Не стоит искать в этом какую-то непогрешимую логику, надо просто принять это как данность.
|
Цитата:
Вот, например: Код:
… |
Цитата:
|
Andrey_Vladimirovich, нет. Вы никак не поймёте — изначально эта переменная окружения и показывала именно архитектуру процессора. Я же Вам даже образец реального кода тех времён привёл.
|
Iska
то, что эта переменная изначально имела отношение к железу, тут у меня вопросов нет. То есть, изначально эта переменная предназначалась исключительно для определения архитектуры CPU (т.е. железа) и вопроса в определении разрядности (как CPU, так и ОС) не стояло, т.к. все были x32. А потом, с появлением x64 решили, что называется "перегрузить" переменную и использовать её, в добавок с другой, в определении разрядности, как ОС, так и запущенного процесса. Так? |
Цитата:
Цитата:
То, что мы используем эти две переменные окружения для определения разрядности ОС — просто побочный эффект, который работает по вышеизложенной причине (и потому, что на пользовательском уровне не встретишь ни IA, ни ARM). |
Win32_Processor еще не советовали?
Код:
enum Arch |
Цитата:
|
Цитата:
|
Цитата:
Мне кажется, что данными письменами в совокупности с ссылками птычки на скрижали, можно диавола вызывать. |
Цитата:
|
Цитата:
Код:
cls |
Цитата:
|
Отлично, 9 - это х64! :nunchaku:
Ядро твоей системы владеет верной информацией) |
Цитата:
Если так уж чешется, код на С Код:
#include <stdio.h> |
приветствую.
перечитал эту тему, а также - http://forum.oszone.net/thread-141160-7.html брал разные скрипты, предложенные gora, а также другими, но что-то не выходит, то срабатывает там, а там нет, то наоборот. в общем мне надо добавить ключи в реестр. если win7 x86: Код:
[HKEY_CLASSES_ROOT\*\shell\notepad] Код:
[HKEY_CLASSES_ROOT\*\shell\notepad] |
И охота же некропостерствовать...
Начнем с начала: поддержка win7 закончилась еще в январе 2020, посему сначала рекомендация: избавляйтесь от них. И чем быстрее тем лучшее. Цитата:
Далле, судя по тому что нужно, достаточно проверить наличие/значение переменной %ProgramFiles(x86)%. Если есть - суем вариант для x64, нету - x86. Код:
if defined %ProgramFiles(x86)% ( И еще, проще и надежнее добавлять ключи через те же групповые политики, это позволит и точнее прицелится в нужную разрядность, и позволит избежать подобных проверок на непонятно зачем. |
Elven,
Мне нравится 7-ка, я на хп сидел пока стало невыносимо ))) мне батником нужно добавить. Код:
@echo off |
Нужно смотреть, что в переменных. Емнип в win7 была какая-то муть относительно того, какой процесс запущен (т.е. в зависимости от разрядности процесса переменная может поменять значение), т.о. из батника нужно вывести значение переменных ProgramFiles, ProgramFiles(x86), ProgramW6432 и посмотреть какая из них что возвращает. Что-то мне кажется, что для запуска из cmd ProgramFiles вернет значение "C:\Program Files (x86)", но это не точно.
Собственно, совать в reg add переменные я и не требовал, вполне бы нормально сработали и изначально указанные пути. |
Цитата:
Цитата:
Скрытый текст
![]() Wu-Tang, тут ещё зависит, какой разрядности запускается сам reg.exe — на него ведь точно так же действуют перенаправления файловой системы и реестра. |
Elven,
так какой есть выход? Iska, я так понимаю в 32битной запускается 32битный, а вот в 64битной хз, либо тот, либо другой. есть какое-н решение в этой задаче? сейчас у меня есть специально две виртуалки х86 и х64, тестирую параллельно внося правки, но либо там не отрабатывает, либо там. |
|
Iska,
ну как ни так, я привел скрипт, который запускаю, сказали все правильно. x86 - https://dropmefiles.com/1bUOi x64 - https://dropmefiles.com/fM9ES в х86 обрезает путь после добавления в реестр. |
Два варианта:
1. вбить пути без переменных (рили, они здесь нужны как собаке пятый хвост); 2. добавить вывод переменных %ProgramFiles(x86)% и %ProgramFiles% с паузой в конец скрипта, меня терзают смутные сомнения, что под x86 она либо пустая либо еще что-то с ней не так. Код:
echo "ProgramFiles(x86): %ProgramFiles(x86)%" Код:
echo "ProgramFiles(x86): %ProgramFiles(x86)%" > vars.txt Код:
set program |
Цитата:
Код:
"ProgramFiles(x86): " Цитата:
Код:
Microsoft Windows [Version 6.1.7601] |
Добрался до возможности посмотреть что там было по ссылкам нормально. Wu-Tang, вы указываете в посте один код, а запускаете другой. Причем это на момент записи видео, как я понимаю, а теперь там вообще какой-то третий если не пятый может быть.
Если используется код который был на видео - убрать оттуда к лешему set он там не используется, только захламляет код. В двух местах убрать! Код:
set xos=x64 |
Elven,
видимо привел старый, который тестил ранее, чем на видео, тогда так нужно: Код:
@echo off |
Wu-Tang, писать в HKCR не рекомендуется, это плохо, не делайте, как я.
Код:
@echo off |
El Sanchez,
Класс! Спасибо!!! столько вариантов перебрал, только ваш отработал корректно и на х86 и на х64. только в пути ошибка была, я поправил: Код:
setlocal ps и почему это плохо и не рекомендуется? с пунктом для контекстного меню разобрались, для полного счастья решить бы вопрос с копированием папки notepad++ в зависимости от разрядности: Код:
xcopy "Notepad++" "%ProgramFiles(x86)%\Notepad++" /H /E /G /Q /R /Y /I поможите? |
Wu-Tang,
а что такое вы открываете в блокноте что это требует проверку на разрядность, тем более из конт.меню, т.е. где было там и осталось? и зачем делать проверку разрядности при копировании заранее известной разрядности программы? Вы же знаете разрядность "Notepad++" однозначно, соответственно 32-х разрядную тупо кладете в "Program Files (x86)", а 64-х разрядную в "Program Files", чего тут проверять-то? |
alpap,
а вы читали вобще посты ранее? я там описал, зачем мне это. |
Цитата:
Цитата:
Цитата:
Цитата:
|
El Sanchez,
Цитата:
Цитата:
Код:
|
Цитата:
Цитата:
Например, у меня есть раздел: \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.html
Код:
Windows Registry Editor Version 5.00 \HKEY_USERS\S-1-5-21-GUID-1000_Classes\.html
Код:
Windows Registry Editor Version 5.00 \HKEY_CLASSES_ROOT\.html
Код:
Windows Registry Editor Version 5.00 В остальном: Цитата:
|
Iska,
Цитата:
|
Цитата:
Цитата:
|
El Sanchez,
этот вариант я продумал ))) тесты провожу под обычным юзером с включенным uac, у меня твики упакованы модулем 7zsfx и после распака добавляются с повышением прав до - система с помощью powerrun. |
Время: 09:06. |
Время: 09:06.
© OSzone.net 2001-