CMD/BAT - [решено] Вызов программы с помошью call

Аватара пользователя
rene

CMD/BAT - [решено] Вызов программы с помошью call

Сообщение rene »

Доброго времени суток!

В примерах часто встречаю такое:



Код:

Код: Выделить всё

call calc
call notepad

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

Re: CMD/BAT - [решено] Вызов программы с помошью call

Сообщение Iska »

Цитата rene:



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




Покажите ссылки на эти примеры.
Аватара пользователя
Iska

Re: CMD/BAT - [решено] Вызов программы с помошью call

Сообщение Iska »

Символ «~» в этом месте означает «убрать обрамляющие кавычки из содержимого переменной, если они есть». См.:



Код:
Аватара пользователя
rene

Re: CMD/BAT - [решено] Вызов программы с помошью call

Сообщение rene »

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, но в этом случае контроль над дочерним приложением будет утерян."
Аватара пользователя
greg zakharov

Re: CMD/BAT - [решено] Вызов программы с помошью call

Сообщение greg zakharov »

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

Re: CMD/BAT - [решено] Вызов программы с помошью call

Сообщение Iska »

Да, я вижу, что там именно так и написано. Другое дело, что фраза «контроль над дочерним приложением» бессмысленна по сути и по содержанию. Никакого «контроля» нет. Что с 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

Re: CMD/BAT - [решено] Вызов программы с помошью call

Сообщение rene »

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



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



Пример

[spoiler]X.cmd[/spoiler]

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@echo off
echo 1. [%~0]
call "Y.cmd"
echo 2. [%~0]
"Y.cmd"
echo 3. [%~0]
exit /b 0








Y.cmd

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@echo off
echo 4.[%~0]
exit /b 0







Изображение



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

Re: CMD/BAT - [решено] Вызов программы с помошью call

Сообщение rene »

Цитата rene:



И потому вызывать бинарник с помощью call не имеет никакого смысла?
CMD/BAT - [решено] Вызов программы с помошью call




Я не вижу.
Аватара пользователя
rene

Re: CMD/BAT - [решено] Вызов программы с помошью call

Сообщение rene »

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

Вернуться в «Скриптовые языки администрирования Windows»