Винайшов спосіб, як можна визначити тип операційної системи 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-х бітного додатку.
Сергій Горіченко
Немає коментарів:
Дописати коментар