Помощь по функции GetSystemVersion

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,069
Реакции
5,784
Решил испробовать функцию getsystem из закрепленной темы,для создания универсального сценария по восстановлению служб.

Я раньше использовал примерно такой ход для определения ОС

CMD/BATCH:
SET Version=Unknown
    VER | FINDSTR /IL "5.0" > NUL
    IF %ERRORLEVEL% EQU 0 SET Version="Windows 2000"
    VER | FINDSTR /IL "5.1." > NUL
    IF %ERRORLEVEL% EQU 0 SET Version="Windows XP"
    VER | FINDSTR /IL "5.2." > NUL
    IF %ERRORLEVEL% EQU 0 SET Version="Windows 2003"
    VER | FINDSTR /IL "6.0." > NUL
    IF %ERRORLEVEL% EQU 0 SET Version="Windows Vista"
    VER | FINDSTR /IL "6.1." > NUL
    IF %ERRORLEVEL% EQU 0 SET Version="Windows 7"
    VER | FINDSTR /IL "6.2." > NUL
    IF %ERRORLEVEL% EQU 0 SET Version="Windows 8"

  
    echo.
    echo.


    IF %VERSION% == "Windows XP" GOTO XP
    IF %VERSION% == "Windows 2000" GOTO XP
    IF %VERSION% == "Windows 2003" GOTO XP
    IF %VERSION% == "Windows Vista" GOTO Elevate
    IF %VERSION% == "Windows 7" GOTO Elevate
    IF %VERSION% == "Windows 8" GOTO Elevate
    GOTO Unknown

Но с вышеупомянутой функцией немного сложнее.
Прошу помочь разобрать на примере такого кода
CMD/BATCH:
@echo off
Chcp 866 >nul
  title  Восстановление запуска служб




  SetLocal EnableExtensions
  call :GetSystemVersion "OSVer" "Core" "Build" "Family" "EnvironCore"

echo Версия ОС:      %OSVer%
echo Рязрядность ОС: %Core%
echo Сборка:        %Build%
echo Семейство:      %Family%
echo Разрядность среды запуска Batch: %EnvironCore%
echo.
echo.
echo (Введите с клавиатуры букву Y если версия и разрядность ОС определены верно
echo или N что бы произвести выбор вручную и нажмите клавишу ENTER)
      echo.
      set ch=
        set /p ch=Данные определены верно? (Y/N)
        if /i "!ch!"=="Y" (тут идет вызов основного блока восстановления
            ) else ( тут вызов вбс  скрипта с выбором вручную)
            ::было бы неплохо добавить защиту от дурака
pause
Exit /B



:GetSystemVersion [OSVersion] [OSCore] [OSBuild] [OSFamily] [EnvironmentCore]

  Set xOS=x64& If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x32
  set %~5=x32& if "%xOS%"=="x64" echo "%PROGRAMFILES%" |>nul find "x86" || set %~5=x64
  set "%~2=%xOS%"
  set _key=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
  For /f "tokens=2*" %%a In ('Reg.exe query "%_key%" /v "CurrentBuildNumber"^|Find "CurrentBuildNumber"') do set "%~3=%%~b"
  For /f "tokens=2*" %%a In ('Reg.exe query "%_key%" /v "CurrentVersion"^|Find "CurrentVersion"') do set "_ver=%%~b"
  For /f "tokens=2*" %%a In ('Reg.exe query "%_key%" /v "ProductName"^|Find "ProductName"') do set "%~1=%%~b"
  if "%_ver:~0,1%"=="6" (set "%~4=Vista") else (set "%~4=NT")
Exit /B

::Блок сценариев для для скрипта восстановления запуска служб

::  поблоковое определение нужного твика
:: тут надо бы определять блоки исходя из переменных


:Exite
cls
  Echo ====== Работа скрипта завершена ======
  Echo.
  Echo.
  Echo Скрипт подгтовлен Koza Nozdri & Drakogas
  Echo Сайт: SafeZone.cc
  Echo E-mail: Fire@safezone.cc
  Echo.
  Echo======================================================================
  Echo Бесплатное лечение компьютерных вирусов и решение проблем в работе ПК
    ping -n 15 127.0.0.1 > NUL
  Exit
 
Последнее редактирование модератором:
Тоже самое, только я теперь называю это не:
CMD/BATCH:
IF "%VERSION%"=="Windows XP" GOTO XP
IF "%VERSION%"=="Windows Vista" GOTO Elevate
...
а
CMD/BATCH:
IF "%Family%"=="NT" GOTO XP
IF "%Family%"=="Vista" GOTO Elevate
Т.е. по сути можно все заменить этими двумя строчками.
 
Последнее редактирование:
а точно)))
затупил.
щас блоки накидаю проверю.
у меня тока дилемма:
диалог полностью в cmd или vbs сделать....
 
Делай как красивше -))

В логовыжималке будет так:
- это скомбинированный BAT + JS файл без создания вспомогательных
с возможностью выбора какую ветку JS-скрипта выполнять:
- та, что повышает привилегии;
- или та, что выводит Popap (msgbox).

Демо:
CMD/BATCH:
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
chdir /d "%~dp0"

call :GetSystemVersion "OSVer" "Core" "Build" "Family" "EnvironCore"

:UAC
IF "%Family%"=="Vista" if /i "%~1" neq "Admin" cscript.exe //nologo //e:jscript "%~f0" "Run" "Admin"& Exit

:: Кнопки ДА/НЕТ
call :msgbox " Архив SIT поврежден. & Хотите скачать его еще раз?" YesNo
if errorlevel 1 (echo Ответ ДА) else (echo Ответ НЕТ)

:: А здесь только ОК
call :msgbox "Выполните инструкцию, затем нажмите ОК." OK

pause
exit /B

:msgbox [Сообщение] [Вид кнопок - YesNo или OK]
:: JS-имитация окна MSGBOX с возвратом кода ошибки при нажатой клавише: 0 - Нет, 1 - Да]
  if /i "%~2"=="YesNo" (set ButtonConst=36) else (set ButtonConst=64)
  for /f %%a in ('cscript.exe //nologo //e:jscript "%~f0" "Msgbox" "%~1" "%ButtonConst%"') do set msg_err=%%a
  if "%msg_err%"=="6" set "msg_retCode=1"
  if "%msg_err%"=="7" set "msg_retCode=0"
Exit /B %msg_retCode%

:GetSystemVersion [OSVersion] [OSCore] [OSBuild] [OSFamily] [EnvironmentCore]
  Set xOS=x64& If "%PROCESSOR_ARCHITECTURE%"=="x86" If Not Defined PROCESSOR_ARCHITEW6432 Set xOS=x32
  set %~5=x32& if "%xOS%"=="x64" echo "%PROGRAMFILES%" |>nul find "x86" || set %~5=x64
  set "%~2=%xOS%"
  set _key=HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion
  For /f "tokens=2*" %%a In ('Reg.exe query "%_key%" /v "CurrentBuildNumber"^|Find "CurrentBuildNumber"') do set "%~3=%%~b"
  For /f "tokens=2*" %%a In ('Reg.exe query "%_key%" /v "CurrentVersion"^|Find "CurrentVersion"') do set "_ver=%%~b"
  For /f "tokens=2*" %%a In ('Reg.exe query "%_key%" /v "ProductName"^|Find "ProductName"') do set "%~1=%%~b"
  if "%_ver:~0,1%"=="6" (set "%~4=Vista") else (set "%~4=NT")
Exit /B

*/switch (WScript.Arguments(0)) {
  case "Run":
  {
    switch (WScript.Arguments(1))
    {
      case "Admin": {
        new ActiveXObject('Shell.Application').ShellExecute (WScript.ScriptFullName,'Admin','','runas',1);
        break;
      }
    }
  }
  case "Msgbox": {
    WScript.Echo (new ActiveXObject('WScript.Shell').Popup (WScript.Arguments(1).replace(/&/g,'\n'),-1,'',+WScript.Arguments(2)));
    break;
  }
}

поврежден. & Хотите
- знак & в моей функции используется как перенос строки.
 
Последнее редактирование:
Вот msgbox ДЕМО покомпактнее.
Запускай, смотри:

CMD/BATCH:
@echo off
SetLocal EnableExtensions

call :msgbox "Это сообщение не будет дожидаться нажатия ОК" OK NoWait

call :msgbox "Первая Строка\nВторая строка" OK

call :msgbox " Вы хотите запустить \n Калькулятор?" YesNo

if errorlevel 1 (start "" calc.exe) else (echo Вы выбрали НЕТ.)

echo.
pause
Exit /B


:msgbox [Сообщение] [Вид кнопок - YesNo или OK] {NoWait - опционально, чтобы не дожидаться нажатия клавиши}
:: JS-имитация окна MSGBOX с возвратом кода ошибки при нажатой клавише: 0 - Нет, 1 - Да]
  if /i "%~2"=="YesNo" (set ButtonConst=36) else (set ButtonConst=64)
  echo WScript.Echo (new ActiveXObject('WScript.Shell').Popup (WScript.Arguments(0).replace(/\\n/g,'\n'),-1,'',+WScript.Arguments(1)));>"Msgbox.JS"
  if /i "%~3"=="noWait" (start "" /MIN cscript.exe //nologo //e:jscript "Msgbox.JS" "%~1" "%ButtonConst%"& Exit /B)
  for /f %%a in ('cscript.exe //nologo //e:jscript "Msgbox.JS" "%~1" "%ButtonConst%"^& del "Msgbox.JS"') do set msg_err=%%a
  if "%msg_err%"=="6" (set "msg_retCode=1") else (set "msg_retCode=0")
Exit /B %msg_retCode%
 
Назад
Сверху Снизу