Как заставить IF игнорировать скобку?

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

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

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

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

    Сообщения:
    12.232
    Симпатии:
    4.980
    Вторую скобку

    Команда считает ошибкой.
    Конечно можно написать без скобки...но вообще можно заставить команду IF игнорировать вторую скобку?


    Код ( (Unknown Language)):
    @echo off
    SetLocal EnableExtensions EnableDelayedExpansion


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

    :: Подтверждение правильности определения версии системы

    :Validation


    echo Версия ОС:      %OSVer%
    echo Рязрядность ОС: %Core%
    echo Сборка:        %Build%
    echo Семейство:      %Family%
    echo Разрядность среды запуска Batch: %EnvironCore%
    Echo.
    echo.
    echo.
    Echo Операционная система определена верно?
    echo.
    if %Family%==Vista (
    set choice=
      Set /p choice="(Введите Y если верно и N если не верно затем нажмите ENTER) "
      if not defined choice goto menu
        if "%choice%"=="Y"
        if "%choice%"=="N"
          Echo.
          cls
          Echo ═Вы выбрали неверное значение=
          Echo.
          Echo Выберите Y для подтверждения или N для отказа.
          Echo.
          Echo ==============================================
         
    Goto Validation) else (                    
                              set m.msg=^
                              ДА - Версия системы определена верно^&^
                              НЕТ - Выход                        
                              cmd /U /C echo Wscript.Echo Msgbox^(replace^(Wscript.Arguments^(0^),"&",vbLF^),67,"Подтверждение выбора"^)>"msgbox.vbs"
                              for /f %%a in ('cscript "msgbox.vbs" "%m.msg%"^& del "msgbox.vbs"') do set err=%%a
                              if "%err%"=="2"  goto Exite
                              if "%err%"=="6"  goto XP
                              if "%err%"=="7"  goto Exite
                            goto Exite
                                        )                                    )

    pause
    Exit /B
     
  2. Dragokas
    Оффлайн

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

    Сообщения:
    4.498
    Симпатии:
    4.313
    Закрыть кавычку, а первую поставить раньше:
    Код (Text):
    Set /p "choice=(Вв"
    Echo Операционная система определена верно?
    echo.
    if %Family%==Vista (

    Спросило у меня, а потом код взаимодействия выполняется только, если семейство Vista. Как понимать?

    Команда оборвана. Должно быть что-нибуть - переход или открывающая скоба.
    И потом не будет это работать.
    Внутри скобок измененное значение переменной можно раскрыть только через воскл. знак (!)
    Либо тогда 2 варианта: отказаться от скобок в пользу Goto; использовать подпрограмму.

    ++ к чему столько диалогов. Давай что-то одно или Msgbox или Choice.

    Только, если ради практики:
    Код (Text):
    @echo off
    SetLocal EnableExtensions EnableDelayedExpansion

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

    :Menu
    cls
    :Validation
    :: Подтверждение правильности определения версии системы
    echo Версия ОС:      %OSVer%
    echo Рязрядность ОС: %Core%
    echo Сборка:        %Build%
    echo Семейство:      %Family%
    echo Разрядность среды запуска Batch: %EnvironCore%
    Echo.
    echo.
    Echo Операционная система определена верно?
    echo.
    :Again
      set choice=
      Set /p choice="(Введите Y если верно и N если не верно затем нажмите ENTER) "
      if not defined choice goto menu
      if /i "%choice%"=="Y" goto Exite
      if /i "%choice%"=="N" (
        Echo.
        Echo ═Вы выбрали неверное значение=
        Echo.
        Goto Again
      ) else (
        set m.msg=^
        ДА - Версия системы определена верно^&^
        НЕТ - Выход
        cmd /U /C echo Wscript.Echo Msgbox^(replace^(Wscript.Arguments^(0^),"&",vbLF^),67,"Подтверждение выбора"^)>"msgbox.vbs"
        for /f %%a in ('cscript "msgbox.vbs" "!m.msg!"^& del "msgbox.vbs"') do set err=%%a
        if "!err!"=="2"  goto Exite
        if "!err!"=="6"  goto XP
        if "!err!"=="7"  goto Exite
        goto Exite
      )

    :Exite
    :XP
    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
    Но я бы заменил все в пару строк с мессейджбоксом (кстати, кнопка "Отмена", вроде как тоже лишняя).
     
    Kиpилл нравится это.
  3. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.232
    Симпатии:
    4.980
    сначала только chois хотел,но вспомнил что
    хр не понимает это.
    А ведь точно,зачем большой диалог)))
    Оставлю Msgbox,просто интересно было как со скобкой быть.

    Да нет,это временное явление.

    Спасибо.
     
    Последнее редактирование: 14 ноя 2013
  4. Dragokas
    Оффлайн

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

    Сообщения:
    4.498
    Симпатии:
    4.313
    Ясно.
    Да, но скрипт на этом явлении и остановится -))
    ___________
    make it easy.
     
  5. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.232
    Симпатии:
    4.980
    Это понятно,нужные блоки еще не дописал (восстановление запуска служб для всех ос одним скриптом+расширения)
     
  6. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.232
    Симпатии:
    4.980
    А кто нибудь подскажите как будет выводиться
    echo Семейство: %Family%
    Для ХР?
     
  7. Sandor
    Оффлайн

    Sandor Ассоциация VN

    Сообщения:
    2.549
    Симпатии:
    980
    Так:
    family.jpg
     
    Kиpилл нравится это.
  8. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.232
    Симпатии:
    4.980
    Sandor, это шутка?:woot:
    Я имел ввиду как будет выведено сообщение о том как определилась система,вот скрипт
    Код ( (Unknown Language)):
    @echo off
    SetLocal EnableExtensions EnableDelayedExpansion


    call :GetSystemVersion "OSVer" "Core" "Build" "Family" "EnvironCore"
    :: Подтверждение правильности определения версии системы

    :Validation


    echo Версия ОС:      %OSVer%
    echo Рязрядность ОС: %Core%
    echo Сборка:        %Build%
    echo Семейство:      %Family%
    echo Разрядность среды запуска Batch: %EnvironCore%
    Echo.


      set m.msg=^
      Версия системы определена верно? ^&^                                  
      cmd /U /C echo Wscript.Echo Msgbox^(replace^(Wscript.Arguments^(0^),"&",vbLF^),67,"Подтверждение выбора"^)>"msgbox.vbs"
      for /f %%a in ('cscript "msgbox.vbs" "%m.msg%"^& del "msgbox.vbs"') do set err=%%a
      if "%err%"=="2"  echo отмена &pause
      if "%err%"=="6"  echo да &pause
      if "%err%"=="7"  echo нет &pause
                            goto Exite
                                                                        )

    pause


    Exit /B

    :GetSystemVersion [OSVersion] [OSCore] [OSBuild] [OSFamily] [EnvironmentCore]
    :: Определить версию ОС
    :: %1-исх.Переменная для хранения названия ОС
    :: %2-исх.Переменная для хранения разрядности ОС
    :: %3-исх.Переменная для хранения версии сборки ОС
    :: %4-исх.Переменная, идентифицирующая семейство ОС (9x, NT, Vista)
    :: %5-исх.Переменная, идентифицирующая разрядность среды, из-под которой запущен скрипт
      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
     


    Безымянный.jpg
     
    Последнее редактирование: 14 ноя 2013
  9. Mistik
    Оффлайн

    Mistik Активный пользователь

    Сообщения:
    126
    Симпатии:
    187
    У меня вместо нормальных буковок так называемые крякозяблы )) Может лучше транслитом дублировать или инглишем? Win 7
     
    Последнее редактирование: 14 ноя 2013
    Kиpилл нравится это.
  10. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.232
    Симпатии:
    4.980
    Mistik, это потому что кодировка не та,дублировать мысль,спасибо.
    Хотя в готовом скрипте проблем не будет.
     
  11. Sandor
    Оффлайн

    Sandor Ассоциация VN

    Сообщения:
    2.549
    Симпатии:
    980
    Koza Nozdri,

    NT
    И тоже кодировка у меня не верная.
     
    Kиpилл нравится это.
  12. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.232
    Симпатии:
    4.980
  13. Sandor
    Оффлайн

    Sandor Ассоциация VN

    Сообщения:
    2.549
    Симпатии:
    980
    Да, просто NT.
     
    Kиpилл нравится это.
  14. Dragokas
    Оффлайн

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

    Сообщения:
    4.498
    Симпатии:
    4.313
  15. Sandor
    Оффлайн

    Sandor Ассоциация VN

    Сообщения:
    2.549
    Симпатии:
    980
    Учитывая предыдущую ошибку)):
    Код (Text):
    Версия ОС:      Microsoft Windows XP
    Рязрядность ОС: x32
    Сборка:        2600
    Семейство:      NT
    Разрядность среды запуска Batch: x32

    да
     
    Kиpилл нравится это.
  16. Kиpилл
    Оффлайн

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

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

    Сообщения:
    12.232
    Симпатии:
    4.980
    Ну теперь осталось дописать код,будет bat универсальный для восстановления запуска служб.
     

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