PDA

Показать полную графическую версию : [решено] Вызов программы с помошью call


rene
20-06-2017, 13:45
Доброго времени суток!
В примерах часто встречаю такое:

call calc
call notepad

Утверждается что вызов программы через call позволяет контролировать ее завершение, но так и не понял, в чем заключается контроль. Подскажите пожалуйста

Iska
20-06-2017, 14:32
В примерах часто встречаю такое: »
Покажите ссылки на эти примеры.

rene
20-06-2017, 16:13
http://scriptcoding.ru/2013/08/20/funkcii-komandno-stroki/

@echo off
set var=d:\work\test.bat
call notepad.exe "%var%"
call calc.exe
dir
set var=

Раздел Процедуры. Дословно там написано "Учтите, что вы можете вызвать другую программу и без использования функции call, но в этом случае контроль над дочерним приложением будет утерян."

greg zakharov
20-06-2017, 16:41
call никак не может управлять приложением, он лишь может запустить бинарник как пакетный файл и передать ему опредленные параметры, не более. В этом можно убедиться, разобрав код call в дизассемблере.

Iska
20-06-2017, 16:42
Да, я вижу, что там именно так и написано. Другое дело, что фраза «контроль над дочерним приложением» бессмысленна по сути и по содержанию. Никакого «контроля» нет. Что с 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» — переход на скрытую метку конца пакетного файла — если нам, скажем, принципиально не важно возвращать родительскому процессу код завершения пакетного файла. Посему совершенно нет нужды ни в какой метке в конце пакетного файла. Тем паче, что давать меткам имена внутренних команд — моветон.

rene
20-06-2017, 16:52
Большое спасибо за разъяснения

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

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

@echo off

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

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

echo 3. [%~0]

exit /b 0
@echo off

echo 4.[%~0]

exit /b 0

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

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

Iska
20-06-2017, 19:17
И потому вызывать бинарник с помощью call не имеет никакого смысла? »
Я не вижу.

rene
20-06-2017, 19:23
Поясните пожалуйста конструкцию %~0 и чем она отличается от %0 ?

Iska
20-06-2017, 19:31
Символ «~» в этом месте означает «убрать обрамляющие кавычки из содержимого переменной, если они есть». См.:
call /?




© OSzone.net 2001-2012