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

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,354
Реакции
6,331
Вторую скобку


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


Код:
@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
 

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,923
Реакции
6,370
Закрыть кавычку, а первую поставить раньше:
Код:
Set /p "choice=(Вв"

Echo Операционная система определена верно?
echo.
if %Family%==Vista (

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

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

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

Только, если ради практики:
Код:
@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

Но я бы заменил все в пару строк с мессейджбоксом (кстати, кнопка "Отмена", вроде как тоже лишняя).
 

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,354
Реакции
6,331
++ к чему столько диалогов. Давай что-то одно или Msgbox или Choice.
сначала только chois хотел,но вспомнил что
хр не понимает это.
А ведь точно,зачем большой диалог)))
Оставлю Msgbox,просто интересно было как со скобкой быть.

Команда оборвана. Должно быть что-нибуть - переход или открывающая скоба.
Да нет,это временное явление.

Спасибо.
 
Последнее редактирование:

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,923
Реакции
6,370

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,354
Реакции
6,331
Это понятно,нужные блоки еще не дописал (восстановление запуска служб для всех ос одним скриптом+расширения)
 

Sandor

Команда форума
Администратор
Супер-Модератор
Ассоциация VN/VIP
Преподаватель
Сообщения
12,322
Реакции
3,120
Так:
Family
 

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,354
Реакции
6,331
Sandor, это шутка?:woot:
Я имел ввиду как будет выведено сообщение о том как определилась система,вот скрипт
Код:
@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



 
Последнее редактирование:

Mistik

Активный пользователь
Сообщения
121
Реакции
161
У меня вместо нормальных буковок так называемые крякозяблы )) Может лучше транслитом дублировать или инглишем? Win 7
 
Последнее редактирование:

Dragokas

Angry & Scary Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,923
Реакции
6,370

Sandor

Команда форума
Администратор
Супер-Модератор
Ассоциация VN/VIP
Преподаватель
Сообщения
12,322
Реакции
3,120
Учитывая предыдущую ошибку)):
Код:
Версия ОС:      Microsoft Windows XP
Рязрядность ОС: x32
Сборка:        2600
Семейство:      NT
Разрядность среды запуска Batch: x32

да
 

Кирилл

Команда форума
Администратор
Ассоциация VN
Сообщения
14,354
Реакции
6,331
Ну теперь осталось дописать код,будет bat универсальный для восстановления запуска служб.
 
Сверху Снизу