batch-file
funzioni
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 .