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

Кирилл

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


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

Но я бы заменил все в пару строк с мессейджбоксом (кстати, кнопка "Отмена", вроде как тоже лишняя).
 
++ к чему столько диалогов. Давай что-то одно или Msgbox или Choice.
сначала только chois хотел,но вспомнил что
хр не понимает это.
А ведь точно,зачем большой диалог)))
Оставлю Msgbox,просто интересно было как со скобкой быть.

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

Спасибо.
 
Последнее редактирование:
Это понятно,нужные блоки еще не дописал (восстановление запуска служб для всех ос одним скриптом+расширения)
 
Так:
family.jpg
 
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
 
Последнее редактирование:
У меня вместо нормальных буковок так называемые крякозяблы )) Может лучше транслитом дублировать или инглишем? Win 7
 
Последнее редактирование:
Учитывая предыдущую ошибку)):
Код:
Версия ОС:      Microsoft Windows XP
Рязрядность ОС: x32
Сборка:        2600
Семейство:      NT
Разрядность среды запуска Batch: x32

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