Sök…


Anmärkningar

Du kan lägga till startvariabler till funktionen genom att lägga till <parameter> till dess etikett. Dessa startvariabler kan nås med %n där n är startvariabelns nummer ( %1 för den första, %2 för den andra. Denna %n metod fungerar för% 1 -% 9. För parameter 10 - 255 behöver du för att använda Skift- kommandot).
Till exempel:

:function <var1> <var2>

När du använder call :function param1 param2 , kan param1 nås med %1 och param2 med %2 .
Obs! <parameter> är inte strikt nödvändig, men den hjälper till med läsbarheten.

Ett snyggt trick som är användbart när många variabler flyger runt är att använda setlocal och endlocal i tandem med %n . setlocal och endlocal gör i setlocal endlocal funktionen till sin egen separata instans av kommandotolken, variabler som är inställda i den bara sticker runt medan den är i ramen.

Om du använder setlocal och endlocal och returnerar globala värden, använd detta.

endlocal & set var=variable

Detta ställer in det globala värdet var till variable . Du kan kedja dessa för flera variabler.

endlocal & set var=variable & set var2=variable number 2

Detta ställer in globala variabeln var till variable och det globala värdet var2 till variable number 2 .
Eftersom kod i kodblock också utförs samtidigt, kan du göra det också.

if "%var%"=="" (
    endlocal
    set %~2=10
)

Men du kan inte göra det.

if "%var%"=="" (
    set %~2=10
    endlocal
)

Enkel funktion

call :FunctionX
rem More code...

:FunctionX
rem Some code here.
goto :eof

Detta är en mycket enkel funktion. Funktioner är kommandon i programmet som gör flera kommandon åt gången. Funktioner görs genom att skapa en etikett och sätta kod i den, och när den är klar lägger du till en goto :eof eller exit /b <ErrorlevelYou'dLike> som återgår till där den åberopades. Funktioner åberopas med call :functionname adparams .

Funktion med parametrar

call :tohex 14 result
rem More code...

:tohex <innum> <outvar>
set dec=%1
set outvar=%~2
rem %n and %~n are functionally identical, but %~n is slightly safer.
goto :eof

Detta tar de ytterligare parametrarna från call som om funktionen var en separat batchfil.
Obs! <parameter> är inte nödvändig, men det hjälper till med läsbarheten.

Funktion Använda setlocal och endlocal

set var1=123456789
set var2=abcdef
call :specialvars
echo %var1%, %var2%
rem More code...

:specialvars
setlocal
set var1=987654321
set var2=fedcba
endlocal
goto :eof

När du är inne i avsnittets setlocal , endlocal sektionen, är variabler separerade från anroparens variabler, varför% var1% och% var2% inte ändrades.

Kombinera dem alla

set importantvar=importantstuff
call :stuff 123 var1
rem More code...

:stuff <arg1> <arg2>
setlocal
set importantvar=%~1
echo Writing some stuff into %~2!
endlocal
set %~2=some stuff
setlocal
set importantvar=junk
endlocal
goto :eof

Detta använder den grundläggande funktionen, setlocal och endlocal och argument för att skapa en udda liten funktion.

Anonyma funktioner i batchfiler

Anonym funktionsteknik använder det faktum att CALL kommandot använder internt GOTO när subroutine kallas och missbrukar utskrift av hjälpmeddelanden med variabel dubbel expansion :

@echo off
setlocal 
set "anonymous=/?"

call :%%anonymous%% a b c 3>&1 >nul

if "%0" == ":%anonymous%" (
  echo(
  echo Anonymous call:
  echo %%1=%1 %%2=%2 %%3=%3
  exit /b 0
)>&3

Du kan ringa en anonym funktion endast om den är definierad efter CALL (eller efter att ha fäst parentes-sammanhanget om CALL utförs inom parentes). Det kan inte ringas från ett externt skript , men är ett långsammare samtal än normalt.

Ringfunktioner från en annan batchfil

Låt oss ha följande fil som heter bibliotek.cmd :

@echo off

echo -/-/- Batch Functions Library -/-/-

:function1
    echo argument1 - %1
    goto :eof

För att bara köra : -funktionen1 utan koden för resten av filen bör du lägga en etikett : funktion1 i den anropande bat och använda den så här:

@echo off

call :function1 ###
exit /b %errorlevel%

:function1
    library.bat %*

utgången kommer att vara (koden utanför funktionen i library.cmd körs inte):

argument1 - ###

För mer information, kolla detta .



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow