Come impostare una variabile all’interno di un ciclo per / F

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.

  1. 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 …

  2. 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 )