|
25 / 1 / 1
Регистрация: 16.02.2024
Сообщений: 31
|
||||||
Выход из процедуры (подпрограммы), обработка ошибок, передача параметров, контекст19.02.2024, 16:34. Показов 908. Ответов 7
Добрый!
В cmd/bat файле есть вот такой код:
commfile.cmd @file.extТак вот, по логике работы коды, если указанный в командной строке файл не обнаружен, должно выводиться сообщение об ошибке и работа завершается. Но, к сожалению, этого не происходит. При текущем коде выполняется обработка ошибки, выводится сообщение и, почему‐то, возврат в вызывающую функции « :FindCmdFile» и работа продолжается.Если же убрать комментарий со строки (call :ReadCmdFile !_t:~1! _t1 && set "cmd_line_arg=!cmd_line_arg!!_t1!") || goto:End, то тогда отрабатывает нормально, работа, после вывода сообщения, завершается.Прошу подсказать, почему так происходит? И как сделать, чтобы не происходил возврат в вызывающую функцию? Ведь, если я правильно понимаю, выход должен произойти ещё в функции « :ReadCmdFile».Но, если этого даже не произойдёт, то, в соответствии с оператором && после кода call :ReadCmdFile !_t:~1! _t1, присвоение не должно выполняться и будет всё равно ошибка дальше в коде.И второй момент. Если выполнить вызов подпрограммы « :ENotFile» через оператор «GOTO», в сообщении об ошибке всё равно отображается наименование отсутствующего файла file.ext.Из‐за чего это происходит? Ведь при вызове функции « :ENotFile» не передавались никакие аргументы вызова.
0
|
||||||
| 19.02.2024, 16:34 | |
|
Ответы с готовыми решениями:
7
Передача параметров в подпрограммы на Паскале Getopt. Обработка ошибок ввода параметров Процедуры, передача параметров по ссылке |
|
6969 / 2863 / 1100
Регистрация: 06.06.2017
Сообщений: 9,713
|
|||
| 21.02.2024, 16:25 | |||
|
PS: Двоеточия на конце меток не нужны.
0
|
|||
|
25 / 1 / 1
Регистрация: 16.02.2024
Сообщений: 31
|
||||
| 21.02.2024, 19:28 [ТС] | ||||
|
FlasherX, спасибо, что нашли время посмотреть мой вопрос.
Пробывал я с разными вариантами. Если раскомментировать эту строку rem if not exist "%1" goto:ENotFile, закомментировать ту которая сейчас if not exist "%1" (call :ENotFile %1 & exit /b 10), и выполнит командыный файл, то у меня в сообщении всё равно отображалось название файла, которое передано как аргумент в вызов процедуры :ReadCmdFile.Вот поэтому я не могу понять почему это происходит. Я только предполагаю что это потому, что при исполнении команды call создаётся новый контекст, который наследует ранее объявленные и иницализированные переменны.Но в процедуре пременная указана явно как %1, то есть переданный аргумент процедуры. А он не предаётся при вызове.В общем, я понимаю, что что‐то не понимаю, но не пониаю, что надо понять. Выглядет это вот так:
0
|
||||
|
25 / 1 / 1
Регистрация: 16.02.2024
Сообщений: 31
|
||||||||
| 21.02.2024, 20:06 [ТС] | ||||||||
BREAK и continue.Но как тогда сделать, чтобы не было возврата в вызвающую функции. Это возможно? Ведь если даже сделать так:
:FindCmdFile ---> :ReadCmdFile ---> :ENotFile стоит команда goto:End, то всё равно происходит возврат в вызывающие процедуры выше по списку.И опять же, даже если мы вернулись в начало последовательности вызовов ‐ :FindCmdFile, то там есть команда call :ReadCmdFile !_t:~1! _t1 && set "cmd_line_arg=!cmd_line_arg!!_t1!". Как я понимаю, логику работы оператора &&, присвоение не должно происходить, так как из предыдущей процедуры выход был с ненулевым кодом возврата вот в этой команде if not exist "%1" (call :ENotFile %1 & exit /b 10).Но присвоение присходит. И рбота продолжается. Почему!? Добавлено через 11 минут Если вместо этой команды call :ReadCmdFile !_t:~1! _t1 && set "cmd_line_arg=!cmd_line_arg!!_t1!" использовать такую команду (call :ReadCmdFile !_t:~1! _t1 && set "cmd_line_arg=!cmd_line_arg!!_t1!") || goto:End, то, да, работа завершается. Всё как и должно быть.FAQ по файлам BAT/CMD
0
|
||||||||
|
6969 / 2863 / 1100
Регистрация: 06.06.2017
Сообщений: 9,713
|
|||||||||||||||
| 21.02.2024, 20:28 | |||||||||||||||
Результат:
![]()
0
|
|||||||||||||||
|
25 / 1 / 1
Регистрация: 16.02.2024
Сообщений: 31
|
|||
| 21.02.2024, 20:51 [ТС] | |||
|
FlasherX, благодарю, за Ваш ответ, и что помогаете мне разобраться в этом.
Там такая последовательность: Из :FindCmdFile мы вызваем :ReadCmdFile, где и есть команда if not exist "%1" (call :ENotFile %1 & exit /b 10). И после этой команды, где явно указа код возврата как 10, она возвращается обратно в :FindCmdFile, в команду call :ReadCmdFile !_t:~1! _t1 && set "cmd_line_arg=!cmd_line_arg!!_t1!". И вот в этой последней команде и есть оператор &&.Добавлено через 8 минут Ладно, пусть. Получается, что цикл будет исполняться «до последнего», даже если где‐то в вызваемой процедуре есть GOTO на завершение или пока не произойдёт ошибки ниже по цепочке вызово. Понятно, но плохо, что так сделано.
0
|
|||
|
25 / 1 / 1
Регистрация: 16.02.2024
Сообщений: 31
|
||||||||
| 21.02.2024, 21:12 [ТС] | ||||||||
|
Но, блин, так не происходит! Вы видели, наверное, это на приложенном снимке экрана. Запустите, пожулуйста, это код:
tst-goto.cmd file.extИ выводе сообщения будет указано
0
|
||||||||
|
6969 / 2863 / 1100
Регистрация: 06.06.2017
Сообщений: 9,713
|
|||||
| 21.02.2024, 21:52 | |||||
|
0
|
|||||
| 21.02.2024, 21:52 | |
|
Помогаю со студенческими работами здесь
8
Передача параметров вызываемой процедуры в стиле Pascal и Fortran Передача параметров процедуры для создания и удаления ключей
Передача и обработка параметров между двумя PHP скриптами Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение.
И на уровне агентов добавится между грибами или бактериями взаимодействий.
До того я пробовал подход через многомерные массивы,. . .
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|