Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   2 числовых параметра, первый вводит пользователь, второй задается в скрипте (http://forum.oszone.net/showthread.php?t=338788)

crouly0 18-01-2019 00:58 2853045

2 числовых параметра, первый вводит пользователь, второй задается в скрипте
 
Не смог понять суть задания (заранее спасибо)
Написать файл, в котором задается 2 числовых параметра, первый параметр вводится пользователем с клавиатуры, второй задается в скрипте, и проверяется их существование. Если первая переменная существует, она выводится на экран, иначе выводится сообщение об ошибке. Если вторая переменная существует, она прибавляется к первой и выводится на экран, иначе выводится сообщение об ошибке.

Iska 18-01-2019 07:11 2853060

Неудивительно, что Вы не поняли. Поскольку под «параметром» обычно подразумевают совсем другое.

Попробуйте так:
Скрытый текст
Код:

@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


crouly0 19-01-2019 00:13 2853205

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

crouly0 19-01-2019 01:44 2853216

самое приличное, что смог составить, проблема в том, что работает только в идеальных условиях, когда все значения числа, при вводе буквы, всё равно показывает значение суммы
Скрытый текст
@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

YuS_2 19-01-2019 10:08 2853229

Цитата:

Цитата crouly0
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


Iska 19-01-2019 10:58 2853236

Хоть это и глупо — проверять значение, заданное непосредственно в самом пакетном файле (я лично не вижу в этом ни малейшего смысла — в отличие от проверки интерактивно вводимых данных), но — пожалуйста:
Скрытый текст
Код:

@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 нечисловое значение и посмотреть, что будет.

crouly0 19-01-2019 11:42 2853244

Вложений: 1
при вводи первого значения, числовым, второе значение из программы (буква), присваивает значение вводимой переменной 0, и считает сумму, хотя должна быть ошибка, также при буквенном значении вводимой переменной, по условию, второе значение отображаться не должно, но ошибку выдает верно

Iska 19-01-2019 12:05 2853254

Что есть «первое значение», что есть «второе значение из программы (буква)»? Вы не могли бы выражаться в общепринятых терминах — «переменная окружения», «пакетный файл», «iFirstVar», «iSecondVar»?!

Вот примеры исполнения пакетного файла с кодом из предыдущего сообщения, со вводом числового значения для переменной окружения iSecondVar и со вводом не числового значения для переменной окружения iSecondVar:
Скрытый текст


Вот пример исполнения пакетного файла с кодом из предыдущего сообщения, в котором добавлена одна буква «a» — таким образом делается тупая попытка присвоения переменной окружения iFirstVar не числового значения непосредственно в коде пакетного файла (что, естественно, сразу вызывает ошибку, которую мы отслеживаем и выводим соответствующее сообщение):
Скрытый текст

megaloman 19-01-2019 12:59 2853263

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


crouly0 19-01-2019 13:01 2853264

Вложений: 2
я говорю о проверки iFirstVar

crouly0 19-01-2019 13:09 2853268

Вложений: 1
megaloman, та же проблема, с которой столкнулся я, не проверяется значение из программы iSecondVar, если в программе задать значение например (m), то программа выдает что значение iSecondVar, а по условию должна быть ошибка, и не должна выдавать сумму

crouly0 19-01-2019 13:13 2853269

Вложений: 1
megaloman, iSecondVar не проходит проверку, если внутри программы, дать значение например (m), то в результате получается значение 0, по условию должна быть ошибка, без подсчета суммы, вообщем у меня такая же проблема

crouly0 19-01-2019 13:18 2853270

1. проверка вводимого числа
если это не число, то ошибка, программа остановилась

2. Если введено число, выводим его на экран
3. проверяем число заданное в программе
если это не число, ошибка, программа останавливается
4. если число заданное в программе число, выводим его на экран
выводим сумму.

а получается, если в программе не число, то выполняется в любом случае 4 пункт, но со значение 0

YuS_2 19-01-2019 13:28 2853271

Выдалось время и было интересно запустить краш-тест :)

Цитата:

Цитата Iska
но — пожалуйста: »

Здесь валится на символах: & | "

Цитата:

Цитата megaloman
Мой вариант, частично списанный у 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 2853282

crouly0,
Цитата:

Цитата 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 0

YuS_2, Не берусь в CMD организовать контроль на всевозможные спецсимволы. ИМХО, надо принять некоторые риски. ©Всегда можно подобрать данные, способные одурачить программу.

YuS_2 19-01-2019 15:31 2853288

Цитата:

Цитата megaloman
Не берусь в CMD организовать контроль на всевозможные спецсимволы. »

Это да, cmd - он такой, со спецсимволами не особо хорошо дружит... :)
Но свести к минимуму всевозможные коллизии синтаксиса, всё же, можно...

megaloman 19-01-2019 15:44 2853290

YuS_2,
Цитата:

Но свести к минимуму всевозможные коллизии синтаксиса, всё же, можно...
Цена вопроса? Извините, засоряю форум мемуарами, когда-то давно в досе наваял бухгалтерскую программу, организовал контроль, в случае ошибки выдал сообщение типа: "ТРАЛЯЛЯЛЯ, для продолжения нажми любую клавишу". Все было хорошо, но скоро получил звонок: программа виснет! Поехал в командировку и выяснил, что из всех 102 клавиш бухгалтер не думая совершенно, без злого умысла механически нажимала Pause

YuS_2 19-01-2019 16:24 2853294

Цитата:

Цитата megaloman
Цена вопроса? »

Да, собственно, несколько строк в батнике... вот:
Цитата:

Цитата YuS_2
даю свою версию на краш-тест »

в том числе, возможна обработка восьмеричных чисел... ну и шестнадцатиричные тоже можно запустить, но это уже надо немного поизвращаться, т.к. буквы в составе числа придется обрабатывать другими "регулярками"...
===
В вышеприведенный код добавлена возможность обработки шестнадцатиричных чисел


Время: 22:18.

Время: 22:18.
© OSzone.net 2001-