Показать полную графическую версию : 2 числовых параметра, первый вводит пользователь, второй задается в скрипте
Не смог понять суть задания (заранее спасибо)
Написать файл, в котором задается 2 числовых параметра, первый параметр вводится пользователем с клавиатуры, второй задается в скрипте, и проверяется их существование. Если первая переменная существует, она выводится на экран, иначе выводится сообщение об ошибке. Если вторая переменная существует, она прибавляется к первой и выводится на экран, иначе выводится сообщение об ошибке.
Неудивительно, что Вы не поняли. Поскольку под «параметром» обычно подразумевают совсем другое.
Попробуйте так:
@echo off
setlocal enableextensions enabledelayedexpansion
set /a iFirstVar = 12345
set iSecondVar=
set /p "iSecondVar=Enter digital value: "
if defined iFirstVar (
echo Environment variable [iFirstVar] = [%iFirstVar%].
if defined iSecondVar (
echo Environment variable [iSecondVar] = [%iSecondVar%].
set /a iSumm = %iFirstVar% + %iSecondVar%
echo Summ of environment variables [iFirstVar] and [iSecondVar] = [!iSumm!].
) else (
echo Environment variable [iSecondVar] not defined.
exit /b 2
)
) else (
echo Environment variable [iFirstVar] not defined.
exit /b 1
)
endlocal
exit /b 0
https://i.imgur.com/GD4CYdb.png
хороший вариант, единственное столкнулся с проблемой, по задаче должно быть именно число, а в этом варианте проходят и буквы, пробовал вот такой вариант для проверки символов, но проходит только для вводимого числа не могу связать со вторым числом, сумму считает, но при не верных данных, не останавливается на ошибке вводимого числа, а на втором числе высчитывает 0
@echo off
:st
set /p "v=Введите число: "
for /f "delims=" %%A in ('echo.%v%^| findstr "[^0-9]"') do set "nv=%%~A"
if not "%v%"=="%nv%" (echo.Это число %v%) else (goto st)
pause>nul
самое приличное, что смог составить, проблема в том, что работает только в идеальных условиях, когда все значения числа, при вводе буквы, всё равно показывает значение суммы@echo off
set /a "n=2"
set /p "v=vvedide chisl: "
set /a "summ=%v%+%n%"
for /f "delims=" %%A in ('echo.%v%^| findstr "[^0-9]"') do set "nv=%%~A"
for /f "delims=" %%A in ('echo.%n%^| findstr "[^0-9]"') do set "nt=%%~A"
if not "%v%"=="%nv%" (echo.chislo1 %v%) else (echo.bag | pause>exit)
if "%n%"=="%nt%" (echo. summa %summ%) else (echo.bag)
pause
exit
for /f "delims=" %%A in ('echo.%v%^| findstr "[^0-9]"') do set "nv=%%~A" »
если требуется проверка на ввод числа, то делается это немного по-другому:
@echo off
set /a a=2
:begin
cls
set /p "b=Введите число: "
if "%b%"=="&" (echo Это не число&pause&goto begin)
if "%b%"=="" (echo Это не число&pause&goto begin)
if "%b%"=="<" (echo Это не число&pause&goto begin)
if "%b%"==">" (echo Это не число&pause&goto begin)
echo.%b%|>nul findstr /rc:"[^0-9]"&&(echo это не число&pause&goto begin)
set /a sum=a+b
echo sum=%sum%
pause&exit /b
Хоть это и глупо — проверять значение, заданное непосредственно в самом пакетном файле (я лично не вижу в этом ни малейшего смысла — в отличие от проверки интерактивно вводимых данных), но — пожалуйста:
@echo off
setlocal enableextensions enabledelayedexpansion
>nul 2>&1 set /a iFirstVar = 12345 || (
echo Need only digital value content for [iFirstVar] environment variable.
exit /b 1
)
set iSecondVar=
set /p "iSecondVar=Enter digital value: "
if defined iFirstVar (
echo Environment variable [iFirstVar] = [%iFirstVar%].
if defined iSecondVar (
echo Environment variable [iSecondVar] = [%iSecondVar%].
echo %iSecondVar%| >nul 2>&1 findstr.exe /r /c:"^[0-9]*$" && (
set /a iSumm = %iFirstVar% + %iSecondVar%
echo Summ of environment variables [iFirstVar] and [iSecondVar] = [!iSumm!].
) || (
echo Need only digital value content for [iSecondVar] environment variable.
exit /b 4
)
) else (
echo Environment variable [iSecondVar] not defined.
exit /b 3
)
) else (
echo Environment variable [iFirstVar] not defined.
exit /b 2
)
endlocal
exit /b 0
Можете попробовать задать для переменной окружения iFirstVar вместо «12345» нечисловое значение, можете попробовать ввести для переменной окружения iSecondVar нечисловое значение и посмотреть, что будет.
при вводи первого значения, числовым, второе значение из программы (буква), присваивает значение вводимой переменной 0, и считает сумму, хотя должна быть ошибка, также при буквенном значении вводимой переменной, по условию, второе значение отображаться не должно, но ошибку выдает верно
Что есть «первое значение», что есть «второе значение из программы (буква)»? Вы не могли бы выражаться в общепринятых терминах — «переменная окружения», «пакетный файл», «iFirstVar», «iSecondVar»?!
Вот примеры исполнения пакетного файла с кодом из предыдущего сообщения (http://forum.oszone.net/post-2853236.html#post2853236), со вводом числового значения для переменной окружения iSecondVar и со вводом не числового значения для переменной окружения iSecondVar:
https://i.imgur.com/eVkfiXI.png
Вот пример исполнения пакетного файла с кодом из предыдущего сообщения (http://forum.oszone.net/post-2853236.html#post2853236), в котором добавлена одна буква «a» — таким образом делается тупая попытка присвоения переменной окружения iFirstVar не числового значения непосредственно в коде пакетного файла (что, естественно, сразу вызывает ошибку, которую мы отслеживаем и выводим соответствующее сообщение):
https://i.imgur.com/nWkPaes.png
megaloman
19-01-2019, 12:59
crouly0, Мой вариант, частично списанный у Iska. Контроль корректности вводимых данных имеется.@Echo Off
cls
2>nul Set /A iSecondVar=12345
:Begin
Set "in="
set /p "in=Enter digital value: "
cls
If Not defined in (
Echo First number not defined
Pause
Exit /B 1
)
Set /A iFirstVar=in 2>nul
If Not "%in%"=="%iFirstVar%" (
Echo First number invalid entered "%in%"
GoTo :Begin
)
Echo First number= %iFirstVar%
If Not defined iSecondVar (
Echo Second number not defined
Pause
Exit /B 2
)
Echo Second number= %iSecondVar%
Echo.
Set /A Summ=%iFirstVar%+%iSecondVar%
echo Summ=iFirstVar+iSecondVar=%iFirstVar%+%iSecondVar%=%Summ%
Echo.
Pause
я говорю о проверки iFirstVar
megaloman, та же проблема, с которой столкнулся я, не проверяется значение из программы iSecondVar, если в программе задать значение например (m), то программа выдает что значение iSecondVar, а по условию должна быть ошибка, и не должна выдавать сумму
megaloman, iSecondVar не проходит проверку, если внутри программы, дать значение например (m), то в результате получается значение 0, по условию должна быть ошибка, без подсчета суммы, вообщем у меня такая же проблема
1. проверка вводимого числа
если это не число, то ошибка, программа остановилась
2. Если введено число, выводим его на экран
3. проверяем число заданное в программе
если это не число, ошибка, программа останавливается
4. если число заданное в программе число, выводим его на экран
выводим сумму.
а получается, если в программе не число, то выполняется в любом случае 4 пункт, но со значение 0
Выдалось время и было интересно запустить краш-тест :)
но — пожалуйста: »
Здесь валится на символах: & | "
Мой вариант, частично списанный у Iska. »
Здесь уже лучше, но валится на: "
В свою очередь, чтобы не быть пустым критиканом, даю свою версию на краш-тест:
@echo off
set /a a=2
:begin
set "b= "
cls
set /p "b=Введите число: "
set "b=%b:"=%"
if "%b%"=="" (echo это не число&pause&goto begin)
echo."%b%"|>nul findstr /rc:"[&|^%%]"&&(echo это не число&pause&goto begin)
if "%b:~,2%"=="0x" (
echo.%b:~2%|>nul findstr /irc:"[^0-9a-f]"&&(echo это не число&pause&goto begin)
) else (
echo.%b%|>nul findstr /rc:"[^0-9]"&&(echo это не число&pause&goto begin)
)
set /a c=b
if %c% equ 0 if not %c% equ %b% (echo некорректное число&pause&goto begin)
echo sum=%a%+%c%
set /a sum=a+c
echo sum=%sum%
pause&exit /b
megaloman
19-01-2019, 14:35
crouly0, значение из программы iSecondVar, если в программе задать значение например (m), то программа выдает что значение iSecondVar, а по условию должна быть ошибка »ИМХО, это чересчур. @Echo Off
cls
Set "In2=12345"
:Begin
Set "In1="
Set /P "In1=Enter iFirstVar digital value: "
Call :Control "First " "iFirstVar" "%In1%"
If %ErrorLevel%==1 GoTo :Begin
If %ErrorLevel%==2 Exit /B 2
Call :Control "Second" "iSecondVar" "%In2%" ||(Pause &Exit /B %ErrorLevel%)
Echo.
Set /A Summ=%iFirstVar%+%iSecondVar%
echo Summ=iFirstVar+iSecondVar=%iFirstVar%+%iSecondVar%=%Summ%
Echo.
Pause
Exit /B 0
:Control
SetLocal
Set "In=%~3"
If Not defined In (
Echo %~1 number not defined. Script cancelling.
EndLocal &Set "%~2="
Exit /B 2
)
2>nul Set /A Inn=%In%
If Not "%In%"=="%Inn%" (
Echo %~1 number invalid entered %3.
EndLocal &Set "%~2="
Exit /B 1
)
Echo %~1 number= %~3
EndLocal &Set /A %~2=%~3
Exit /B 0YuS_2, Не берусь в CMD организовать контроль на всевозможные спецсимволы. ИМХО, надо принять некоторые риски. ©Всегда можно подобрать данные, способные одурачить программу.
Не берусь в CMD организовать контроль на всевозможные спецсимволы. »
Это да, cmd - он такой, со спецсимволами не особо хорошо дружит... :)
Но свести к минимуму всевозможные коллизии синтаксиса, всё же, можно...
megaloman
19-01-2019, 15:44
YuS_2, Но свести к минимуму всевозможные коллизии синтаксиса, всё же, можно... Цена вопроса? Извините, засоряю форум мемуарами, когда-то давно в досе наваял бухгалтерскую программу, организовал контроль, в случае ошибки выдал сообщение типа: "ТРАЛЯЛЯЛЯ, для продолжения нажми любую клавишу". Все было хорошо, но скоро получил звонок: программа виснет! Поехал в командировку и выяснил, что из всех 102 клавиш бухгалтер не думая совершенно, без злого умысла механически нажимала Pause
Цена вопроса? »
Да, собственно, несколько строк в батнике... вот:
даю свою версию на краш-тест »
в том числе, возможна обработка восьмеричных чисел... ну и шестнадцатиричные тоже можно запустить, но это уже надо немного поизвращаться, т.к. буквы в составе числа придется обрабатывать другими "регулярками"...
===
В вышеприведенный код добавлена возможность обработки шестнадцатиричных чисел
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.