Ricerca…


Dichiarazione

Per creare una variabile semplice e assegnarla a un valore o una stringa, utilizzare il comando SET :

SET var=10

Qui, il codice dichiara una nuova variabile var con un valore di 10 . Di default tutte le variabili sono memorizzate internamente come stringhe; questo significa che il valore 10 non è diverso da foo1234 o Hello, World!

Note sulle virgolette

Le virgolette utilizzate saranno incluse nel valore della variabile:

SET var="new value"             <-- %var% == '"new value"'

Spazi nelle variabili

Il linguaggio batch considera gli spazi come parti accettabili dei nomi di variabili. Ad esempio, set var = 10 darà come risultato una variabile chiamata var che contiene il valore 10 (notare lo spazio extra a destra di var e il lato sinistro del 10).

Usare le virgolette per eliminare gli spazi

Per evitare spazi, utilizzare le virgolette per l'intero compito; il nome e il valore della variabile. Questo impedisce anche spazi accidentali rovesciata alla fine della linea (la carattere denota uno spazio):

SET␣var=my␣new␣value␣           <-- '%var%' == 'my new value '
SET␣"var=my␣new␣value"␣         <-- '%var%' == 'my new value'

Inoltre, utilizzare le virgolette quando si uniscono più istruzioni con & o | - In alternativa, metti il ​​simbolo direttamente dopo la fine del valore della variabile:

SET var=val & goto :next        <-- '%var%' == 'val '
SET "var=val" & goto :next      <-- '%var%' == 'val'
SET var=val& goto :next         <-- '%var%' == 'val'

uso

echo %var%

Questo codice farà eco al valore di var

Se viene utilizzato setLocal EnableDelayedExpansion , quanto segue setLocal EnableDelayedExpansion il valore di var (l'espressione standard% var% non funzionerà in quel contesto).

echo !var!

Nei file batch, le variabili possono essere utilizzate in qualsiasi contesto, incluse parti di comandi o parti di altre variabili. Non puoi chiamare una variabile prima di definirla.

Uso delle variabili come comandi:

set var=echo
%var% This will be echoed

Uso delle variabili in altre variabili:

set var=part1
set %var%part2=Hello
echo %part1part2%

Sostituzione variabile

A differenza di altri linguaggi di programmazione, in un file batch una variabile viene sostituita dal suo valore reale prima dell'esecuzione dello script batch. In altre parole, la sostituzione viene eseguita quando lo script viene letto in memoria dal processore dei comandi, non quando lo script viene eseguito successivamente.

Ciò consente l'uso di variabili come comandi all'interno dello script e come parte di altri nomi di variabili nello script, ecc. Lo "script" in questo contesto è una linea - o un blocco - di codice, circondato da parentesi tonde: () .

Ma questo comportamento significa che non è possibile modificare il valore di una variabile all'interno di un blocco!

SET VAR=Hello
FOR /L %%a in (1,1,2) do (
    ECHO %VAR%
    SET VAR=Goodbye
)

stamperà

Hello
Hello

poiché (come vedi, quando si guarda lo script eseguito nella finestra di comando) viene valutato per:

SET VAR=Hello
FOR /L %%a in (1,1,2) do (
    echo Hello
    SET VAR=Goodbye
)

Nell'esempio precedente, il comando ECHO viene valutato come Hello quando lo script viene letto in memoria, quindi lo script farà eco a Hello per sempre, tuttavia molti passaggi vengono fatti attraverso lo script.

Il modo per ottenere il comportamento più "tradizionale" delle variabili (della variabile che viene espansa mentre lo script è in esecuzione) è di abilitare "l'espansione ritardata". Ciò comporta l'aggiunta di quel comando nello script prima dell'istruzione loop (di solito un ciclo FOR, in uno script batch) e l'utilizzo di un punto esclamativo (!) Anziché di un segno di percentuale (%) nel nome della variabile:

setlocal enabledelayedexpansion 
SET VAR=Hello
FOR /L %%a in (1,1,2) do (
    echo !VAR!
    SET VAR=Goodbye
)
endlocal

stamperà

Hello
Goodbye

La sintassi %%a in (1,1,2) fa sì che il ciclo venga eseguito 2 volte: nella prima occasione, la variabile porta il suo valore iniziale di "Ciao", ma al secondo passaggio attraverso il ciclo - dopo aver eseguito il secondo SET dell'istruzione come ultima azione al primo passaggio - questo è cambiato nel valore modificato 'Arrivederci'.

Sostituzione variabile avanzata

Ora, una tecnica avanzata. L'utilizzo del comando CALL consente al processore di comandi batch di espandere una variabile situata sulla stessa riga dello script. Questo può fornire un'espansione multilivello, ripetendo l'uso di CALL e modificatori.

Questo è utile, ad esempio, in un ciclo FOR. Come nel seguente esempio, dove abbiamo un elenco numerato di variabili:

"c:\MyFiles\test1.txt" "c:\MyFiles\test2.txt" "c:\MyFiles\test3.txt"

Possiamo ottenere questo utilizzando il seguente ciclo FOR:

setlocal enabledelayedexpansion
for %%x in (%*) do (
    set /a "i+=1"
    call set path!i!=%%~!i!
    call echo %%path!i!%%
)
endlocal

Produzione:

c:\MyFiles\test1.txt
c:\MyFiles\test2.txt
c:\MyFiles\test3.txt

Si noti che la variabile !i! viene prima esteso al suo valore iniziale, 1, quindi la variabile risultante,% 1, viene espansa al suo valore effettivo di c:\MyFiles\test1.txt . Questa è la doppia espansione della variabile i . Nella riga successiva, i viene nuovamente espanso in due, utilizzando il comando CALL ECHO insieme al prefisso variabile %% , quindi stampato sullo schermo (ovvero visualizzato sullo schermo).

Su ogni passaggio successivo attraverso il ciclo, il numero iniziale viene aumentato di 1 (a causa del codice i+=1 ). Così aumenta a 2 al 2 ° passaggio attraverso il ciclo ea 3 al 3 ° passaggio. Così la stringa echeggiata sullo schermo cambia con ogni passaggio.

Dichiarare più variabili

Quando vengono definite più variabili all'inizio del batch, è possibile utilizzare un modulo di definizione breve utilizzando una stringa sostitutiva .

@echo off
set "vars=_A=good,_B=,_E=bad,_F=,_G=ugly,_C=,_H=,_I=,_J=,_K=,_L=,_D=6
set "%vars:,=" & set "%"

for /f %%l in ('set _') do echo %%l
exit /b

_A=good
_D=6
_E=bad
_G=ugly

Nota nell'esempio precedente, le variabili sono ordinate alfabeticamente in ordine alfabetico, quando stampate sullo schermo.

Utilizzo di una variabile come matrice

È possibile creare un insieme di variabili che possono agire in modo simile a un array (sebbene non siano un vero oggetto array) utilizzando gli spazi SET :

@echo off
SET var=A "foo bar" 123
for %%a in (%var%) do (
    echo %%a
)
echo Get the variable directly: %var%

Risultato:

A
"foo bar"
123
Get the variable directly: A "foo bar" 123

È anche possibile dichiarare la variabile utilizzando gli indici in modo da poter recuperare informazioni specifiche. Questo creerà più variabili, con l'illusione di un array:

@echo off
setlocal enabledelayedexpansion
SET var[0]=A
SET var[1]=foo bar
SET var[2]=123
for %%a in (0,1,2) do (
    echo !var[%%a]!
)
echo Get one of the variables directly: %var[1]%

Risultato:

A
foo bar
123
Get one of the variables directly: foo bar

Si noti che nell'esempio sopra, non è possibile fare riferimento a var senza dichiarare quale sia l'indice desiderato, perché var non esiste per conto proprio. In questo esempio viene utilizzata anche l' setlocal enabledelayedexpansion congiuntamente ai punti esclamativi di !var[%%a]! . È possibile visualizzare ulteriori informazioni a riguardo nella Documentazione Ambito di sostituzione variabile .

Operazioni su variabili

set var=10
set /a var=%var%+10
echo %var%

Il valore finale di var è 20.

La seconda riga non funziona all'interno di un blocco di comando utilizzato ad esempio su una condizione IF o su un ciclo FOR in quanto sarebbe necessaria un'espansione ritardata invece dell'espansione della variabile di ambiente standard.

Ecco un altro modo migliore di lavorare anche in un blocco di comandi:

set var=10
set /A var+=10
echo %var%

L'ambiente del prompt dei comandi supporta i valori interi a 32 bit con segno:

  • aggiunta + e +=
  • sottrazione - e -=
  • moltiplicazione * e *=
  • divisione / e /=
  • modulo divisione % e %=
  • bit a bit AND &
  • bit a bit OR |
  • bit a bit NOT ~
  • XOR bit a bit ^
  • spostamento a sinistra bit a bit <<
  • spostamento a destra bit a bit >>
  • NOT logico !
  • unario meno -
  • raggruppamento con ( e )

L'interprete dei comandi di Windows non supporta i valori integer a 64 bit o i valori in virgola mobile nelle espressioni aritmetiche.

Nota: l'operatore % deve essere scritto in un file batch come %% per essere interpretato come operatore.

In una finestra del prompt dei comandi che esegue la riga di comando set /A Value=8 % 3 assegna il valore 2 alla variabile di ambiente Value e inoltre le uscite 2 .

In un file batch deve essere scritto set /A Value=8 %% 3 per assegnare il valore 2 alla variabile di ambiente Value e nulla viene emesso rispettivamente scritto per gestire STDOUT (output standard). Un set /A Value=8 % 3 righe set /A Value=8 % 3 in un file batch comporterebbe un messaggio di errore Operatore mancante all'esecuzione del file batch.

L'ambiente richiede lo switch /A per le operazioni aritmetiche, non per le variabili stringa ordinarie.

Ogni stringa nell'espressione aritmetica dopo che set /A indica se un numero o un operatore viene interpretato automaticamente come nome di una variabile di ambiente.

Per questo motivo, fare riferimento al valore di una variabile con %variable% o con !variable! non è necessario quando il nome della variabile consiste solo di caratteri di parole (0-9A-Za-z_) con il primo carattere che non è una cifra che è particolarmente utile all'interno di un blocco di comandi che inizia con ( e termina con una corrispondenza ) .

I numeri vengono convertiti da stringa a intero con la funzione Ct C ++ strtol con base zero, il che significa determinazione della base automatica che può facilmente portare a risultati imprevisti.

Esempio:

set Divided=11
set Divisor=3

set /A Quotient=Divided / Divisor
set /A Remainder=Divided %% Divisor

echo %Divided% / %Divisor% = %Quotient%
echo %Divided% %% %Divisor% = %Remainder%

set HexValue1=0x14
set HexValue2=0x0A
set /A Result=(HexValue1 + HexValue2) * -3

echo (%HexValue1% + %HexValue2%) * -3 = (20 + 10) * -3 = %Result%

set /A Result%%=7
echo -90 %%= 7 = %Result%

set OctalValue=020
set DecimalValue=12
set /A Result=OctalValue - DecimalValue

echo %OctalValue% - %DecimalValue% = 16 - 12 = %Result%

L'output di questo esempio è:

11 / 3 = 3
11 % 3 = 2
(0x14 + 0x0A) * -3 = (20 + 10) * -3 = -90
-90 %= 7 = -6
020 - 12 = 16 - 12 = 4

Le variabili non definite sulla valutazione dell'espressione aritmetica sono sostituite con il valore 0.

Impostazione delle variabili da un input

Utilizzando l'opzione /p con il comando SET è possibile definire le variabili da un input.

Questo input può essere un input dell'utente (tastiera):

echo Enter your name : 
set /p name=
echo Your name is %name%

Quale può essere semplificato in questo modo:

set /p name=Enter your name :
echo Your name is %name%

Oppure puoi ottenere l'input da un file:

set /p name=< file.txt

in questo caso otterrai il valore della prima riga da file.txt

Ottenere il valore di varie linee in un file:

(
   set /p line1=
   set /p line2=
   set /p line3=

) < file.txt


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