Вопрос по windows – Что-то вроде функции / метода в пакетных файлах?

49

Есть ли что-нибудь, что имитирует метод, подобный тому, который известен по Java, C # и т. д.? У меня есть 5 строк команд в командном файле, эти 5 строк используются в нескольких местах внутри командного файла. Я не могу использовать goto, потому что в зависимости от уровня ошибки, созданного этими 5 строками, у меня могут быть разные действия. Я попытался поместить свои 5 строк в пакетный файл 5lines.bat, но исходный пакетный файл original.bat вызывает только 5lines.bat и не выполняет команды после вызова 5lines.bat). Это как мой оригинал. летучая мышь выглядит так:

<code>5lines.bat
echo this gets never called, how to make sure this gets called?
</code>

В 5lines.bat нет выхода или что-то в этом роде! Как я могу убедиться, что строка после 5lines.bat будет вызвана?

Ваш Ответ

8   ответов
1

& Quot; анонимный & Quot; функции в пакетных файлах:

@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

Блок анонимной функции должен быть помещен сразу после оператора вызова и должен заканчиваться оператором выхода

Хитрость в том, чтоCALL внутренне используетGOTO а затем возвращается к строке, гдеCALL был выполнен. С двойным расширением GOTO выдается справочное сообщение (с%%/?%% аргумент), а затем продолжает сценарий. Но после того, как это закончено, это возвращается кCALL - вот почему требуется утверждение if.

4

эта страница

Кроме того, вы можете поместить общие строки в другой пакетный файл, который вы вызываете из основного

Error: User Rate Limit Exceeded stefan.at.wpf
12

Solution:


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%

19

безусловно, будет работать для имитации функции.

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

call 5lines.bat
echo this will now get called
17

Function call

call :myDosFunc 100 "string val"

Function body

:myDosFunc
echo. Got Param#1 %~1
echo. Got Param#2 %~2
goto :eof
67

Вы можете использовать команду вызова:

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

Источник :Пакетные функции

Error: User Rate Limit Exceededgoto :eof ?
Error: User Rate Limit Exceeded stefan.at.wpf
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded:myDosFuncError: User Rate Limit Exceeded
goto :eofError: User Rate Limit Exceededexit /bError: User Rate Limit ExceededCALL
1

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

echo what
rem the third param gives info to which label it should comeback to
call :myDosFunc 100 "string val" ComeBack

:ComeBack
echo what what
goto :eof

:myDosFunc
echo. Got Param#1 %~1
echo. Got Param#2 %~2
set returnto=%~3
goto :%returnto%
Error: User Rate Limit Exceededgoto :%returnto%? goto :eofError: User Rate Limit Exceededcall ...Error: User Rate Limit ExceededcallError: User Rate Limit Exceeded
1

ользования - смотритеОтличная библиотека Ричи Лоуренса.

Похожие вопросы