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

Кирилл

Команда форума
Администратор
Сообщения
13,775
Реакции
6,145
Баллы
913
Вторую скобку

Команда считает ошибкой.
Конечно можно написать без скобки...но вообще можно заставить команду 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

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,115
Реакции
5,894
Баллы
648
Закрыть кавычку, а первую поставить раньше:
Код:
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
Но я бы заменил все в пару строк с мессейджбоксом (кстати, кнопка "Отмена", вроде как тоже лишняя).
 

Кирилл

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

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

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

Кирилл

Команда форума
Администратор
Сообщения
13,775
Реакции
6,145
Баллы
913
Это понятно,нужные блоки еще не дописал (восстановление запуска служб для всех ос одним скриптом+расширения)
 

Кирилл

Команда форума
Администратор
Сообщения
13,775
Реакции
6,145
Баллы
913
А кто нибудь подскажите как будет выводиться
echo Семейство: %Family%
Для ХР?
 

Кирилл

Команда форума
Администратор
Сообщения
13,775
Реакции
6,145
Баллы
913
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


Безымянный.jpg
 
Последнее редактирование:

Mistik

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

Кирилл

Команда форума
Администратор
Сообщения
13,775
Реакции
6,145
Баллы
913
Mistik, это потому что кодировка не та,дублировать мысль,спасибо.
Хотя в готовом скрипте проблем не будет.
 

Dragokas

Very kind Developer
Команда форума
Супер-Модератор
Разработчик
Клуб переводчиков
Сообщения
6,115
Реакции
5,894
Баллы
648

Sandor

Ассоциация VN/VIP
Преподаватель
Сообщения
5,301
Реакции
1,805
Баллы
563
Учитывая предыдущую ошибку)):
Код:
Версия ОС:      Microsoft Windows XP
Рязрядность ОС: x32
Сборка:        2600
Семейство:      NT
Разрядность среды запуска Batch: x32

да
 

Кирилл

Команда форума
Администратор
Сообщения
13,775
Реакции
6,145
Баллы
913
Ну теперь осталось дописать код,будет bat универсальный для восстановления запуска служб.
 
Сверху Снизу