1

Тема: JScript:определение разрядности ОС

Приветствую. Играл с различными вариантами определения разрядности системы.

Проверял код из под 32-битной версии интерпретатора


    var w=[], navigator = new ActiveXObject("HTMLFile").parentWindow.navigator;
    w.push(navigator.platform);
    w.push(navigator.cpuClass);
    w.push(navigator.userAgent);
    WScript.Echo(w.join("\n"));

и получил:


---------------------------
Windows Script Host
---------------------------
Win32
x86
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; WebMoney Advisor; InfoPath.3)
---------------------------
ОК   
---------------------------

navigator.platform и navigator.cpuClass некорректно показывают разрядность.

В общем, хотел уйти от использования WMI, реестра. Остановился на следующем варианте:


function GetCPUArc() {
    var window = new ActiveXObject("HTMLFile").parentWindow;
    return (/WOW64|Win64/i.test(window.navigator.userAgent) || window.navigator.platform=='Win64')?"X64" : "X86";
    }

2 (изменено: Flasher, 2015-01-20 19:59:42)

Re: JScript:определение разрядности ОС

var Arch = 'x64';
var x = new ActiveXObject('WScript.Shell').Environment('System')('PROCESSOR_ARCHITECTURE');
if (x == 'x86'){Arch = 'x32';}
WScript.Echo(Arch);

3

Re: JScript:определение разрядности ОС

Flasher, там не всё так просто.

4

Re: JScript:определение разрядности ОС

alexii, да проще некуда.

5

Re: JScript:определение разрядности ОС

Flasher пишет:

alexii, да проще некуда.

Опрометчивое заявление. Вы проверяли как будет вести себя такой код на 32-битной ОС, установленной на компьютер с 64-разрядным процессором ? "Битность" процессора и "битность" системы (ОС) разные вещи.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

6

Re: JScript:определение разрядности ОС

Xameleon пишет:

Опрометчивое заявление.

Отнюдь нет.

Xameleon пишет:

Вы проверяли как будет вести себя такой код на 32-битной ОС, установленной на компьютер с 64-разрядным процессором ?

Вы, наверное, будете удивлены, но у меня именно такой. И , разумеется, проверял. И, как подсказывает форум, не только я.

7

Re: JScript:определение разрядности ОС

Flasher, а если запустить Ваш код на x64 под x86-версией wscript.exe/cscript.exe?

8

Re: JScript:определение разрядности ОС

alexii пишет:

Flasher, а если запустить Ваш код на x64 под x86-версией wscript.exe/cscript.exe?

Поделюсь наблюдениями.
Не зависит от разрядности wscript.exe/cscript.exe:

.Environment('System')('PROCESSOR_ARCHITECTURE');

Зависит от разрядности wscript.exe/cscript.exe:

.Environment('Process')('PROCESSOR_ARCHITECTURE');
Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251

9 (изменено: Flasher, 2015-01-21 13:34:50)

Re: JScript:определение разрядности ОС

Это и понятно. В том числе касается консоли и 32-битных оболочек.

10

Re: JScript:определение разрядности ОС

Flasher,

Вот здесь хорошо разобрано.

A2 пишет:

rem 4) PROCESSOR_ARCHITECTURE==x86 и PROCESSOR_ARCHITEW6432==AMD64 — 64-х разрядная система на базе x64, программа запущена в режиме x86;

rem 5) PROCESSOR_ARCHITECTURE==x86 и PROCESSOR_ARCHITEW6432==IA64 — 64-х разрядная система на базе Itanium, программа запущена в режиме эмуляции x86.

Я веду к тому, что программа может быть запущена в режиме эмуляции и в итоге вводить пользователя в заблуждение о разрядности системы одним только значением PROCESSOR_ARCHITECTURE. Поэтому проверяют 2 переменные: PROCESSOR_ARCHITECTURE и PROCESSOR_ARCHITEW6432.

Такую проблему обсуждали в блоге MSDN:

http://blogs.msdn.com/b/david.wang/arch … px#4506188

Цитата пользователя:

Satish пишет:

Hi,

Thanks for the Post. I stuck up with the Problem where a 32 bit App on 64 bit read the environment variable  "PROCESSOR_ARCHITECTURE" and returned x86 even though the Processor Arch is AMD64. Now i tried your solution and it gave me original arch. Thank you very much for this valuable Post.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

11

Re: JScript:определение разрядности ОС

Подскажите, на сколько адекватно решение в 1 посте? Всегда ли у вас выводится верный ответ?

12 (изменено: Flasher, 2015-01-26 07:13:06)

Re: JScript:определение разрядности ОС

Xameleon пишет:

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

Возможно, вы опять будете удивлены, но я именно с такой программы ранее и начинал проводить тесты. Достаточно разделять 2 режима среды - текущего процесса и системный. Вот применение последнего всегда покажет верный результат, если не трогать виртуальные машины, конечно.

Xameleon пишет:

Поэтому проверяют 2 переменные:

Ну, так я раньше и делал, собственно. Но, по всей видимости, зря.

13

Re: JScript:определение разрядности ОС

Flasher,

Вот применение последнего всегда покажет верный результат, если не трогать виртуальные машины, конечно.

Так почему же их не брать в рассмотрение ? За что такое обделение вниманием ?

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

14

Re: JScript:определение разрядности ОС

Xameleon, может, потому что я (да и подавляющее большинство, смею полагать) ими редко пользуюсь.. http://smiles.kolobok.us/mini/pardon_mini.gif

15

Re: JScript:определение разрядности ОС

Значит я в это большинство не вхожу ). Приходится активно пользоваться для проверки скриптов под разные версии ОС: XP / Win 7 / Win 8. На сколько мне известно, коллега JSman тоже активно их использует.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

16

Re: JScript:определение разрядности ОС

Xameleon
В таком случае по возможности предлагаю проверить в 64-битной среде на 64-битном эмуляторе запуск 32-битной виртуальной оси со стандартным вызовом скрипта. Что покажет?

17

Re: JScript:определение разрядности ОС

Flasher, поддерживаю !

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

18

Re: JScript:определение разрядности ОС

Flasher пишет:

Xameleon
В таком случае по возможности предлагаю проверить в 64-битной среде на 64-битном эмуляторе запуск 32-битной виртуальной оси со стандартным вызовом скрипта. Что покажет?

Код


    var w=[], navigator = new ActiveXObject("HTMLFile").parentWindow.navigator;
    w.push(navigator.platform);
    w.push(navigator.cpuClass);
    w.push(navigator.userAgent);
    WScript.Echo(w.join("\n"));

Вернет


Win32
x86
Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)

Код


var Arch = 'x64';
var x = new ActiveXObject('WScript.Shell').Environment('System')('PROCESSOR_ARCHITECTURE');
if (x == 'x86'){Arch = 'x32';}
WScript.Echo(Arch);

Вернет


x32

19 (изменено: Flasher, 2015-01-28 08:09:27)

Re: JScript:определение разрядности ОС

JSman
Отлично, значит, и там проблем нет. http://smiles.kolobok.us/mini/good_mini.gif
Можно юзать оба варианта.

P.S.: navigator.platform и navigator.cpuClass можно было и не показывать, они не годятся, только - navigator.UserAgent.

20

Re: JScript:определение разрядности ОС

Что-то типа:


wshShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITECTURE%") = "x86" && wshShell.ExpandEnvironmentStrings("%PROCESSOR_ARCHITEW6432%") = "%PROCESSOR_ARCHITEW6432%" ? "x86" : "x64"

не годится? Я так определяю, неверно?

21

Re: JScript:определение разрядности ОС

Ну, как минимум первая часть точно бессмысленна. А вторая - на любителя. Я раньше %PROCESSOR_ARCHITEW6432% по числу результирующих символов проверял. С приведённым мной методом короче, и с перезагрузкой системы она поменяется, а эта в x86-системах, если кто-то туда нарочно вставил, там и зависнет.

22

Re: JScript:определение разрядности ОС

Хотелось бы знать что в этом коде бессмысленно:


var wshShell = new ActiveXObject('WScript.Shell');
var x86str = 'x86';
var W6432str = '%PROCESSOR_ARCHITEW6432%';
var x86 = wshShell.ExpandEnvironmentStrings('%PROCESSOR_ARCHITECTURE%');
var W6432 = wshShell.ExpandEnvironmentStrings(W6432str);
WScript.Echo('x86: ' + x86); // AMD64
WScript.Echo('W6432: ' + W6432); // %PROCESSOR_ARCHITEW6432%
var arch = x86 === x86str && W6432 === W6432str ? "x86" : "x64";
WScript.Echo('arch: ' + arch);

23

Re: JScript:определение разрядности ОС

Это:

var x86 = wshShell.ExpandEnvironmentStrings('%PROCESSOR_ARCHITECTURE%');
WScript.Echo('x86: ' + x86); // AMD64
...x86 === x86str...

24

Re: JScript:определение разрядности ОС

В приведенном коде %PROCESSOR_ARCHITECTURE% работает вместе с %PROCESSOR_ARCHITEW6432%, уважаемый Xameleon выше расписал, со ссылками, это неверное решение? Я использую в одном консольном приложении, проблем не было пока.

25 (изменено: Flasher, 2015-01-30 22:11:57)

Re: JScript:определение разрядности ОС

Я же объяснял принцип выше. В приведённом коде они работают вместе, соответственно, если один возвращает неверный результат, то и итоговый будет такой же.
Если белое = чёрное И синее  = синее, то - белое, иначе - синее. То есть в случае ошибки получаем синее.

26

Re: JScript:определение разрядности ОС

dab00, Flasher видимо прав. На днях поставил Win 10 и Win 10 x64 виртуалки на VMWare Player. Хостовая система у меня Win 7 x64. На виртуалках результаты адекватны:

Win 10 возвращает - x32,
Win 10 x64 возвращает - x64.

Проверил даже через WScript из SysWOW.
Так что для определения разрядности ОС (среды запуска) этого (одной переменной) вполне достаточно. Вторая переменная нужна только для определения действительной (физической) разрядности "железа", на котором всё запускается. Но необходимость в этом возникает крайне редко.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

27

Re: JScript:определение разрядности ОС

Спасибо, Xameleon. Я правильно понял что такой вариант "правильный":


new ActiveXObject('WScript.Shell').ExpandEnvironmentStrings('%PROCESSOR_ARCHITECTURE%') === 'x86' ? 'x86' : 'x64'

Если угодно так:


new ActiveXObject('WScript.Shell').Environment('System')('PROCESSOR_ARCHITECTURE') === 'x86' ? 'x86' : 'x64'

Хотелось бы уже резюмировать как-то, о чем толкует уважаемый Flasher я в принципе не понимаю

28

Re: JScript:определение разрядности ОС

dab00, Продолжаю изучать этот вопрос.

Заметил, что для скриптового интерпретатора этот код работает адекватно (для WScript.exe x32 и WScript.exe x64), а вот в случае командной строки это не так. Пример, по ссылке ниже, явно даёт мне 2 разных значения в зависимости от режима.

C:\Windows\system32\cmd.exe возвращает AMD64

C:\Windows\SysWOW64\cmd.exe возвращает x86

http://blog.differentpla.net/blog/2013/ … hitew6432/

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

29 (изменено: Flasher, 2015-02-04 18:18:51)

Re: JScript:определение разрядности ОС

dab00 пишет:

Я правильно понял что такой вариант "правильный":

Нет, только второй вариант.

dab00 пишет:

о чем толкует уважаемый Flasher я в принципе не понимаю

Не знаю, как ещё по-другому объяснить это:

Flasher пишет:

Достаточно разделять 2 режима среды - текущего процесса и системный. Вот применение последнего всегда покажет верный результат


Xameleon пишет:

этот код работает адекватно

"этот" - это первый или второй? Я-то с самого начала только за второй топлю.
А что касаемо cmd с примером по ссылке, то там нет возможности задавать родителем System.