Визначення архітектури системи Windows з командного файлу

sgg 03.01.2012 в 15:06

di
di





winbits.png
Винайшов спосіб, як можна визначити тип операційної системи Windows в пакетних/командних (batch) файлах складною командою в одному рядку і результат використовувати вже одразу в наступному, другому.

В наведеному прикладі результат просто виводиться в текстову консоль.

for /f "tokens=1,2,3*" %%i in ('reg query "HKLMSystemCurrentControlSetControlSession ManagerEnvironment" /v PROCESSOR_ARCHITECTURE ^| find "PROCESSOR_ARCHITECTURE"') do (if %%k==X86 set winbit=32 else if %%k==AMD64 set winbit=64) echo Windows bits = %winbit%
Кому цікаво як це працює, далі я "розібрав" нашу "страшну" команду по кісточках.

Для початку основна команда, яка вміщує в себе інші:
for /f "tokens=1,2,3*" %%i in #1 ) do ( #2 ) Основна команда, як це видно вище, включає в себе дві додаткові - перша (#1) "запитує",
друга (#2) - обробляє "відповідь", отриману після "запиту". Вона виконує команду/-и з других дужок (#2)  над результатом, отриманим від першої команди (#1), розділеним на три частини ("tokens=1,2,3*") пробілами.
В якості змінних використовуються літери починаючи з "%%i". Оскільки наша команда (#1) надає у відповідь рядок з трьох "слів" (щось схоже на "    PROCESSOR_ARCHITECTURE    REG_SZ    AMD64"), то й змінних буде саме три - %%i, %%j, %%k.

Команда (#1) в свою чергу складається з двох команд - "reg query" та "find". Перша отримує значення параметру з реєстру Windows, в якому зберігається "архітектура" системи, а друга нам "витягує" з відповіді, тобто знаходить і "віддає" далі саме той рядок, в якому міститься лише потрібна нам інформація.

Повна відповідь запиту
reg query "HKLMSystemCurrentControlSetControlSession ManagerEnvironment" /v PROCESSOR_ARCHITECTURE містить таку інформацію:

HKEY_LOCAL_MACHINESystemCurrentControlSetControlSession ManagerEnvironment      PROCESSOR_ARCHITECTURE    REG_SZ    AMD64
Команда find "PROCESSOR_ARCHITECTURE" залишає нам з цієї відповіді лише

    PROCESSOR_ARCHITECTURE    REG_SZ    AMD64


, про що я вже писав трішки вище. Далі цей рядок розкладається пробілами на три частини і ці частини тимчасово зберігаються в змінних таким чином:
%%i = PROCESSOR_ARCHITECTURE  %%j = REG_SZ  %%k = AMD64 Де, %%i - назва параметру, %%j - тип параметру, %%k - значення параметру (саме та інформація, яку ми шукаємо).

Після того, як ми отримали значення, нам лишається лише його перевірити за отриманним значенням і зберегти в іншій змінній, зовній для команди for, інформацію про розрядність для подальшого її використання (в моєму прикладі - друку в консолі).

Покомандне пояснення коду:
if %%k==X86           // якщо k=X86     set winbit=32     //   (тоді)присвоїти winbits=32  else                  //  в іншому разі     if %%k==AMD64     //    якщо k=AMD64        set winbit=64   //      (тоді) присвоїти winbits=64
В моєму випадку змінна winbit набуває значення 64, після чого воно виводиться на консоль командою
echo Windows bits = %winbit%
В результаті маємо:
winbits_result.png


Бажаю успіхів в новому році з новими знаннями!

P.S. Щоправда, можна банально використовувати системну змінну "%PROCESSOR_ARCHITECTURE%", але, нажаль, вона не завжди коректна, особливо в оточенні 32-х бітного додатку.

Сергій Горіченко



CZtQSpzUubI