03 січня 2012

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





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

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

for /f "tokens=1,2,3*" %%i in ('reg query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /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 "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v PROCESSOR_ARCHITECTURE
містить таку інформацію:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment 
    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%

В результаті маємо:


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

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

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



Немає коментарів:

Дописати коментар