Come si esegue il ciclo di ciascuna riga in un file di testo utilizzando un file batch di Windows?

Mi piacerebbe sapere come eseguire il ciclo di ogni riga in un file di testo utilizzando un file batch di Windows ed elaborare ogni riga di testo in successione.

I post qui sotto hanno aiutato molto, ma non hanno fatto quello che ho affermato nella mia domanda in cui avevo bisogno di elaborare l’intera linea nel suo complesso. Ecco cosa ho trovato a lavorare.

for /F "tokens=*" %%A in (myfile.txt) do [process] %%A 

La parola chiave token con un asterisco (*) estrae tutto il testo per l’intera riga. Se non inserisci l’asterisco, tirerà solo la prima parola sulla linea. Presumo che abbia a che fare con gli spazi.

Per il comando su TechNet

Apprezzo tutti i post!


Se ci sono spazi nel percorso del file, è necessario utilizzare usebackq . Per esempio.

 for /F "usebackq tokens=*" %%A in ("my file.txt") do [process] %%A 

Dal riferimento della riga di comando di Windows:

Per analizzare un file, ignorando le righe commentate, digitare:

 for /F "eol=; tokens=2,3* delims=," %i in (myfile.txt) do @echo %i %j %k 

Questo comando analizza ogni riga in Myfile.txt, ignorando le righe che iniziano con un punto e virgola e passando il secondo e il terzo token da ciascuna riga al corpo FOR (i token sono delimitati da virgole o spazi). Il corpo dell’istruzione FOR fa riferimento a% i per ottenere il secondo token,% j per ottenere il terzo token e% k per ottenere tutti i token rimanenti.

Se i nomi dei file forniti contengono spazi, utilizzare le virgolette attorno al testo (ad esempio, “Nome file”). Per utilizzare le virgolette, è necessario utilizzare usebackq. In caso contrario, le virgolette vengono interpretate come la definizione di una stringa letterale da analizzare.

A proposito, puoi trovare il file della guida della riga di comando sulla maggior parte dei sistemi Windows in:

  "C:\WINDOWS\Help\ntcmds.chm" 

In un file batch è necessario utilizzare %% anziché % : (digitare help for )

 for /F "tokens=1,2,3" %%i in (myfile.txt) do call :process %%i %%j %%k goto thenextstep :process set VAR1=%1 set VAR2=%2 set VAR3=%3 COMMANDS TO PROCESS INFORMATION goto :EOF 

Che cosa fa: Il “richiama: process %% i %% j %% k” alla fine del comando for passa le informazioni acquisite nel comando for da myfile.txt alla subroutine “process”.

Quando si utilizza il comando for in un programma batch, è necessario utilizzare il doppio segno% per le variabili.

Le seguenti righe passano quelle variabili dal comando for al processo ‘sub-routine’ e consentono di elaborare queste informazioni.

 set VAR1=%1 set VAR2=%2 set VAR3=%3 

Ho alcuni usi piuttosto avanzati di questa configurazione esatta che sarei disposto a condividere se sono necessari ulteriori esempi. Aggiungi il tuo EOL o Delendi, se necessario, ovviamente.

Migliorare la prima risposta “FOR / F ..”: Quello che dovevo fare era chiamare eseguire tutti gli script elencati in MyList.txt, quindi ha funzionato per me:

 for /F "tokens=*" %A in (MyList.txt) do CALL %A ARG1 

–OR, se desideri farlo sulla linea multipla:

 for /F "tokens=*" %A in (MuList.txt) do ( ECHO Processing %A.... CALL %A ARG1 ) 

Modifica: l’esempio sopra riportato è per l’esecuzione del ciclo FOR dal prompt dei comandi; da uno script batch, è necessario aggiungere una% in più, come mostrato di seguito:

 ---START of MyScript.bat--- @echo off for /F "tokens=*" %%A in ( MyList.TXT) do ( ECHO Processing %%A.... CALL %%A ARG1 ) @echo on ;---END of MyScript.bat--- 

@ La risposta di MrKraus è istruttiva. Inoltre, aggiungo che se vuoi caricare un file che si trova nella stessa directory del file batch, anteponi il nome del file con% ~ dp0. Ecco un esempio:

 cd /d %~dp0 for /F "tokens=*" %%A in (myfile.txt) do [process] %%A 

NB:: Se il nome del file o la directory (ad esempio myfile.txt nell’esempio precedente) ha uno spazio (ad esempio “my file.txt” o “c: \ Programmi”), utilizzare:

 for /F "tokens=*" %%A in ('type "my file.txt"') do [process] %%A 

, con la parola chiave type che chiama il programma type , che visualizza il contenuto di un file di testo. Se non vuoi subire il sovraccarico di chiamare il comando type, devi cambiare la directory nella directory del file di testo. Nota che il tipo è ancora richiesto per i nomi di file con spazi.

Spero che questo aiuti qualcuno!

Oppure puoi escludere le opzioni tra virgolette:

 FOR /F %%i IN (myfile.txt) DO ECHO %%i 

La risposta accettata è buona, ma presenta due limiti.
Elimina linee e righe vuote che iniziano con ;

Per leggere le righe di qualsiasi contenuto, è necessaria la tecnica di triggerszione ritardata dell’espansione.

 @echo off SETLOCAL DisableDelayedExpansion FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ text.txt"`) do ( set "var=%%a" SETLOCAL EnableDelayedExpansion set "var=!var:*:=!" echo(!var! ENDLOCAL ) 

Findstr è usato per anteporre ogni riga al numero di riga e ai due punti, quindi le linee vuote non sono più vuote.

DelayedExpansion deve essere disabilitato, quando si accede al parametro %%a , altrimenti punti esclamativi ! e i caret ^ saranno persi, poiché hanno significati speciali in quella modalità.

Ma per rimuovere il numero di linea dalla linea, è necessario abilitare l’espansione ritardata.
set "var=!var:*:=!" rimuove tutti i primi due punti (usando delims=: rimuoverà anche tutti i due punti all’inizio di una riga, non solo quello di findstr).
L’endlocal distriggers nuovamente l’espansione ritardata per la riga successiva.

L’unica limitazione è ora il limite di lunghezza della linea di ~ 8191, ma non sembra esserci modo di superarlo.

Ecco un file bat che ho scritto per eseguire tutti gli script SQL in una cartella:

 REM ****************************************************************** REM Runs all *.sql scripts sorted by filename in the current folder. REM To use integrated auth change -U  -P  to -E REM ****************************************************************** dir /B /O:n *.sql > RunSqlScripts.tmp for /F %%A in (RunSqlScripts.tmp) do osql -S (local) -d DEFAULT_DATABASE_NAME -U USERNAME_GOES_HERE -P PASSWORD_GOES_HERE -i %%A del RunSqlScripts.tmp 

Se si dispone di una famiglia Windows NT (una con cmd.exe come shell), provare il comando FOR / F.

Esempi modded qui per elencare le nostre app Rails su Heroku – grazie!

 cmd /C "heroku list > heroku_apps.txt" find /v "=" heroku_apps.txt | find /v ".TXT" | findstr /r /v /c:"^$" > heroku_apps_list.txt for /F "tokens=1" %%i in (heroku_apps_list.txt) do heroku run bundle show rails --app %%i 

Codice completo qui