Что-то вроде функции/метода в пакетных файлах?
есть ли что-нибудь, что подражает методу, как известно, с Java, С# и т.д.? У меня есть 5 строк команд в пакетном файле, эти 5 строк используются в более чем одном месте внутри командного файла. Я не могу использовать goto, потому что в зависимости от уровня ошибок, созданного этими 5 строками, у меня есть разные действия, которые следуют. Я попытался поместить мои 5 строк в пакетный файл 5lines.bat, но исходный пакетный файл original.bat вызывает только 5lines.bat и не выполняет команды после вызова 5lines.bat): То, как выглядит мой original.bat как:
5lines.bat
echo this gets never called, how to make sure this gets called?
Нет выхода или что-то вроде этого в 5lines.bat! Как я могу убедиться, что строка после вызова 5lines.bat?
Ответы
Ответ 1
Размещение многократно используемых функций в отдельный командный файл, безусловно, будет работать для имитации функции.
Уловка заключается в том, что вы должны использовать команду call
, чтобы гарантировать, что элемент управления возвращается к вызывающему после завершения второго командного файла.
call 5lines.bat
echo this will now get called
Ответ 2
Вы можете использовать команду вызова:
call:myDosFunc
И затем определите функцию следующим образом:
:myDosFunc - here starts the function
echo. here the myDosFunc function is executing a group of commands
echo. it could do a lot of things
goto:eof
Источник: Пакетные функции
Ответ 3
Решение:
@ECHO OFF
call:header Start Some Operation
... put your business logic here
... make sure EXIT below is present
... so you don't run into actual functions without the call
call:header Operation Finished Successfully
EXIT /B %ERRORLEVEL%
:: Functions
:header
ECHO =================================================
ECHO %*
ECHO =================================================
EXIT /B 0
Важно поставить EXIT/B в конце каждой функции, а также до начала определения функций, в моем примере это:
EXIT/B% ERRORLEVEL%
Ответ 4
Вы можете попробовать использовать примеры, перечисленные на этой странице
В качестве альтернативы вы можете поместить общие строки в другой пакетный файл, который вы вызываете из основного.
Ответ 5
В другом большом учебнике по написанию многоразового кода командного файла - отличная библиотека Richie Lawrence.
Ответ 6
Вот "хак", который позволит вам "анонимные" функции в пакетных файлах:
@echo off
setlocal
set "anonymous=/?"
:: calling the anonymous function
call :%%anonymous%% a b c 3>&1 >nul
:: here the anonymous function is defined
if "%0" == ":%anonymous%" (
echo(
echo Anonymous call:
echo %%1=%1 %%2=%2 %%3=%3
exit /b 0
)>&3
::end of the anonymous function
Анонимный функциональный блок должен быть размещен сразу после оператора вызова и должен заканчиваться оператором exit
трюк заключается в том, что CALL
внутренне использует GOTO
, а затем возвращается к строке, где был выполнен CALL
. При двойном расширении появляется сообщение справки GOTO (с аргументом %%/?%%
), а затем продолжается script. Но после того, как он будет завершен, он вернется к CALL
- для чего нужен оператор if.