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

Кирилл

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


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

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

Спасибо.
 
Последнее редактирование:
Это понятно,нужные блоки еще не дописал (восстановление запуска служб для всех ос одним скриптом+расширения)
 
А кто нибудь подскажите как будет выводиться
echo Семейство: %Family%
Для ХР?
 
Так:
family.webp
 
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



.webp
 
Последнее редактирование:
У меня вместо нормальных буковок так называемые крякозяблы )) Может лучше транслитом дублировать или инглишем? Win 7
 
Последнее редактирование:
Mistik, это потому что кодировка не та,дублировать мысль,спасибо.
Хотя в готовом скрипте проблем не будет.
 
Учитывая предыдущую ошибку)):
Код:
Версия ОС:      Microsoft Windows XP
Рязрядность ОС: x32
Сборка:        2600
Семейство:      NT
Разрядность среды запуска Batch: x32

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