Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Вызов программы с помошью call

Ответить
Настройки темы
CMD/BAT - [решено] Вызов программы с помошью call

Новый участник


Сообщения: 12
Благодарности: 0

Профиль | Отправить PM | Цитировать


Доброго времени суток!
В примерах часто встречаю такое:
Код: Выделить весь код
call calc
call notepad
Утверждается что вызов программы через call позволяет контролировать ее завершение, но так и не понял, в чем заключается контроль. Подскажите пожалуйста

Отправлено: 13:45, 20-06-2017

 

Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата rene:
В примерах часто встречаю такое: »
Покажите ссылки на эти примеры.

Отправлено: 14:32, 20-06-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 12
Благодарности: 0

Профиль | Отправить PM | Цитировать


http://scriptcoding.ru/2013/08/20/fu...mandno-stroki/

Код: Выделить весь код
@echo off
set var=d:\work\test.bat
call notepad.exe "%var%"
call calc.exe
dir
set var=
Раздел Процедуры. Дословно там написано "Учтите, что вы можете вызвать другую программу и без использования функции call, но в этом случае контроль над дочерним приложением будет утерян."

Отправлено: 16:13, 20-06-2017 | #3


Забанен


Сообщения: 793
Благодарности: 260

Профиль | Цитировать


call никак не может управлять приложением, он лишь может запустить бинарник как пакетный файл и передать ему опредленные параметры, не более. В этом можно убедиться, разобрав код call в дизассемблере.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:41, 20-06-2017 | #4


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Да, я вижу, что там именно так и написано. Другое дело, что фраза «контроль над дочерним приложением» бессмысленна по сути и по содержанию. Никакого «контроля» нет. Что с call, что без call. Вся разница заключается только в том, что при использовании call создаётся новый контекст текущего пакетного файла. Каким макаром это может обеспечить некий мифический контроль, а без него этот некий контроль «будет утерян» — остаётся на совести автора. Я лично не могу сказать по этому поводу ничего вразумительного.

Код вида:
Цитата:
Код: Выделить весь код
if "%1"=="" (
echo Peredayte parametry scenariju!) & (goto EXIT)
можно смело именовать «убей себя апстену». Потому как должно быть либо:
Код: Выделить весь код
if "%1"=="" (
    echo Peredayte parametry scenariju!
    exit /b 1
)
либо:
Код: Выделить весь код
if "%1"=="" echo Peredayte parametry scenariju!& exit /b 1
Вместо «exit /b» может быть «goto :eof» — переход на скрытую метку конца пакетного файла — если нам, скажем, принципиально не важно возвращать родительскому процессу код завершения пакетного файла. Посему совершенно нет нужды ни в какой метке в конце пакетного файла. Тем паче, что давать меткам имена внутренних команд — моветон.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:42, 20-06-2017 | #5


Новый участник


Сообщения: 12
Благодарности: 0

Профиль | Отправить PM | Цитировать


Большое спасибо за разъяснения

Отправлено: 16:52, 20-06-2017 | #6


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Я, кажется, понял, в чём дело. Автор, как говорится, слышал звон, да не понял, где он, и, поскольку не разобрался — где, начал выдумать свою извращённую логику, с игрищами и блудницами.

rene, когда мы вызываем из пакетного файла X пакетный файл Y, и нам требуется, чтобы после завершения работы пакетного файла Y управление было возвращено в пакетный файл X, и его обработка продолжилась (а именно так обычно и бывает) — вот тут как раз и следует использовать call <Путь\Имя пакетного файла Y>.
Пример

X.cmd
Код: Выделить весь код
@echo off

echo 1. [%~0]
call "Y.cmd"

echo 2. [%~0]
"Y.cmd"

echo 3. [%~0]

exit /b 0
Y.cmd
Код: Выделить весь код
@echo off

echo 4.[%~0]

exit /b 0

Как видите, после вызова пакетного файла просто как «"Y.cmd"» — управление в пакетный файл X.cmd не возвращается, посему команда «echo 3. [%~0]» не выполняется.

Отправлено: 17:18, 20-06-2017 | #7


Новый участник


Сообщения: 12
Благодарности: 0

Профиль | Отправить PM | Цитировать


Iska, Я правильно понимаю, что это справедливо только для пакетных файлов, а бинарники после выполнения в любом случае не остановят выполнение скрипта? И потому вызывать бинарник с помощью call не имеет никакого смысла?

Отправлено: 18:49, 20-06-2017 | #8


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата rene:
И потому вызывать бинарник с помощью call не имеет никакого смысла? »
Я не вижу.

Отправлено: 19:17, 20-06-2017 | #9


Новый участник


Сообщения: 12
Благодарности: 0

Профиль | Отправить PM | Цитировать


Поясните пожалуйста конструкцию %~0 и чем она отличается от %0 ?

Отправлено: 19:23, 20-06-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Вызов программы с помошью call

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Вызов программы в Windows как в Linux VokaMut Вебмастеру 2 04-09-2014 02:34
C/C++ - [решено] Вызов программы по shortcut lxa85 Программирование и базы данных 1 25-08-2013 01:47
CMD/BAT - Многократный вызов программы Smasher Скриптовые языки администрирования Windows 2 25-09-2012 23:51
Прочее - С помошью какой программы можно включить Wi - Fi адаптер на ноуте Fujitsu - Siemens Tokzic Сетевые технологии 5 18-01-2009 13:41
[решено] программы в открыть с помошью Кос Хочу все знать 1 14-10-2007 09:27




 
Переход