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

Тема в разделе "Пакетные файлы CMD, BAT", создана пользователем Kиpилл, 7 окт 2013.

  1. Kиpилл
    Онлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.197
    Симпатии:
    4.969
    Решил испробовать функцию getsystem из закрепленной темы,для создания универсального сценария по восстановлению служб.

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

    Код (DOS):
    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
    Но с вышеупомянутой функцией немного сложнее.
    Прошу помочь разобрать на примере такого кода
    Код (DOS):
    @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



     
     
    Последнее редактирование модератором: 18 окт 2013
  2. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.471
    Симпатии:
    4.303
    Тоже самое, только я теперь называю это не:
    Код (DOS):
    IF "%VERSION%"=="Windows XP" GOTO XP
    IF "%VERSION%"=="Windows Vista" GOTO Elevate
    ...
    а
    Код (DOS):
    IF "%Family%"=="NT" GOTO XP
    IF "%Family%"=="Vista" GOTO Elevate
    Т.е. по сути можно все заменить этими двумя строчками.
     
    Последнее редактирование: 18 окт 2013
  3. Kиpилл
    Онлайн

    Kиpилл Команда форума Администратор

    Лучший автор месяца

    Сообщения:
    12.197
    Симпатии:
    4.969
    а точно)))
    затупил.
    щас блоки накидаю проверю.
    у меня тока дилемма:
    диалог полностью в cmd или vbs сделать....
     
  4. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.471
    Симпатии:
    4.303
    Делай как красивше -))

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

    Демо:
    Код (DOS):
    @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;
      }
    }
    поврежден. & Хотите
    - знак & в моей функции используется как перенос строки.
     
    Последнее редактирование: 18 окт 2013
    Kиpилл нравится это.
  5. Dragokas
    Оффлайн

    Dragokas Very kind Developer Команда форума Супер-Модератор Разработчик Клуб переводчиков

    Сообщения:
    4.471
    Симпатии:
    4.303
    Вот msgbox ДЕМО покомпактнее.
    Запускай, смотри:

    Код (DOS):
    @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%
     
    Phoenix и Kиpилл нравится это.

Поделиться этой страницей