Ricerca…


Osservazioni

Puoi aggiungere variabili iniziali alla funzione aggiungendo <parameter> alla sua etichetta. È possibile accedere a queste variabili iniziali con %n dove n è il numero della variabile iniziale ( %1 per il primo, %2 per il %n metodo %n funziona con% 1 -% 9. Per il parametro 10 - 255, è necessario usare il comando Shift ).
Per esempio:

:function <var1> <var2>

Dopo aver usato la call :function param1 param2 , param1 possibile accedere con %1 e param2 con %2 .
Nota: il <parameter> non è strettamente necessario, ma aiuta con la leggibilità.

Un trucchetto che è utile quando molte variabili volano è usare setlocal e endlocal in tandem con %n . setlocal e endlocal rendono essenzialmente la funzione la propria istanza separata del prompt dei comandi, mentre le variabili impostate rimangono solo mentre sono nel frame.

Se stai usando setlocal e endlocal , e stai restituendo valori globali, usa questo.

endlocal & set var=variable

Questo imposta il valore globale var su variable . Puoi concatenarli insieme per più variabili.

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

Questo imposta la variabile globale var in variable e il valore globale var2 in variable number 2 .
Poiché anche il codice nei blocchi di codice viene eseguito simultaneamente, puoi farlo anche tu.

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

Ma non puoi farlo.

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

Funzione semplice

call :FunctionX
rem More code...

:FunctionX
rem Some code here.
goto :eof

Questa è una funzione molto semplice. Le funzioni sono comandi in-programma che eseguono più comandi alla volta. Le funzioni vengono create creando un'etichetta e inserendo il codice e, una volta terminata, si aggiunge goto :eof o exit /b <ErrorlevelYou'dLike> che ritorna a dove è stato richiamato. Le funzioni sono invocate con call :functionname adparams .

Funzione con parametri

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

Questo prende i parametri aggiuntivi dalla call come se la funzione fosse un file batch separato.
Nota: il <parameter> non è necessario, ma aiuta con la leggibilità.

Funzione Utilizzo di setlocal e 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

Quando all'interno della sezione setlocal , sezione endlocal , le variabili sono separate dalle variabili del chiamante, quindi perché% var1% e% var2% non sono stati modificati.

Combinandoli tutti

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

Questo utilizza la funzione di base, setlocal e endlocal e gli argomenti per creare una strana piccola funzione.

Funzioni anonime nei file batch

La tecnica delle funzioni anonime utilizza il fatto che il comando CALL utilizza internamente GOTO quando viene chiamata la subroutine e abusa della stampa del messaggio di aiuto con doppia espansione variabile :

@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

È possibile chiamare una funzione anonima solo se è definita dopo la CALL (o dopo aver terminato il contesto delle parentesi se la CALL è eseguita tra parentesi). Non può essere chiamato da uno script esterno , ma è più lento della normale chiamata di funzione.

Chiamare le funzioni da un altro file batch

Consente di avere il seguente file chiamato library.cmd :

@echo off

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

:function1
    echo argument1 - %1
    goto :eof

Per eseguire solo : function1 senza il codice del resto del file dovresti inserire un'etichetta : function1 nel caller bat e usarla in questo modo:

@echo off

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

:function1
    library.bat %*

l'output sarà (il codice al di fuori della funzione in library.cmd non viene eseguito):

argomento1 - ###

Per maggiori informazioni controlla questo .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow