Ho fatto questo codice
dir /B /S %RepToRead% > %FileName% for /F "tokens=*" %%a in ('type %FileName%') do ( set z=%%a echo %z% echo %%a )
echo %%a
funziona bene ma echo %z%
restituisce “echo disabilitato”.
Devo impostare un% z% perché voglio dividere la variabile come %z:~7%
Qualche idea?
Esistono due metodi per impostare e utilizzare le variabili all’interno dell’ambito dei cicli e delle parentesi.
setlocal enabledelayedexpansion
vedi setlocal /?
per un aiuto. Funziona solo su XP / 2000 o versioni più recenti di Windows. quindi usa! variabile! invece di% variabile% all’interno del ciclo …
Creare una funzione batch utilizzando le etichette batch goto :Label
.
Esempio:
for /F "tokens=*" %%a in ('type %FileName%') do call :Foo %%a goto End :Foo set z=%1 echo %z% echo %1 goto :eof :End
Le funzioni batch sono un meccanismo molto utile.
Probabilmente vuoi SETLOCAL ENABLEDELAYEDEXPANSION
. Vedere https://blogs.msdn.microsoft.com/oldnewthing/20060823-00/?p=29993/ per i dettagli.
In sostanza: le %variables%
normali vengono espanse subito dopo che cmd.exe
legge il comando. Nel tuo caso il “comando” è il tutto
for /F "tokens=*" %%a in ('type %FileName%') do ( set z=%%a echo %z% echo %%a )
ciclo continuo. A quel punto z
non ha ancora alcun valore, quindi echo %z%
diventa echo
. Quindi il ciclo viene eseguito e z
è impostato, ma il suo valore non viene più utilizzato.
SETLOCAL ENABLEDELAYEDEXPANSION
consente un’ulteriore syntax SETLOCAL ENABLEDELAYEDEXPANSION
!variable!
. Questo espande anche le variabili, ma lo fa solo prima che ogni comando (sotto) venga eseguito.
SETLOCAL ENABLEDELAYEDEXPANSION for /F "tokens=*" %%a in ('type %FileName%') do ( set z=%%a echo !z! echo %%a )
Questo ti dà il valore corrente di z
ogni volta che viene eseguito l’ echo
.
Mi sforzo per molte ore su questo. Questo è il mio loop per registrare le righe di comando vars. Esempio: Register.bat / param1: value1 / param2: value2
Che cosa è, è in loop tutti i parametri della riga di comando, e che imposta la variabile con il nome corretto per il valore.
Dopo di ciò, puoi usare solo valore impostato =! Param1! imposta value2 =! param2!
indipendentemente dalla sequenza in cui vengono dati i parametri. (i cosiddetti parametri denominati). Nota!! <> !, anziché% <>%.
SETLOCAL ENABLEDELAYEDEXPANSION FOR %%P IN (%*) DO ( call :processParam %%P ) goto:End :processParam [%1 - param] @echo "processparam : %1" FOR /F "tokens=1,2 delims=:" %%G IN ("%1") DO ( @echo a,b %%G %%H set nameWithSlash=%%G set name=!nameWithSlash:~1! @echo n=!name! set value=%%H set !name!=!value! ) goto :eof :End
Prova questo:
setlocal EnableDelayedExpansion ... for /F "tokens=*" %%a in ('type %FileName%') do ( set z=%%a echo !z! echo %%a )
Il seguente dovrebbe funzionare:
setlocal EnableDelayedExpansion for /F "tokens=*" %%a in ('type %FileName%') do ( set "z=%%a" echo %z% echo %%a )
So che questo non è ciò che è stato chiesto, ma ho beneficiato di questo metodo, quando ho provato a impostare una variabile all’interno di un “ciclo”. Utilizza un array. Opzione di implementazione alternativa.
SETLOCAL ENABLEDELAYEDEXPANSION ... set Services[0]=SERVICE1 set Services[1]=SERVICE2 set Services[2]=SERVICE3 set "i=0" :ServicesLoop if defined Services[%i%] ( set SERVICE=!Services[%i%]! echo CurrentService: !SERVICE! set /a "i+=1" GOTO :ServicesLoop )