Iterare tutti i file in una directory usando un ciclo 'for'
-
02-07-2019 - |
Domanda
Come posso iterare su ogni file in una directory usando un ciclo for
?
E come posso sapere se una determinata voce è una directory o se è solo un file?
Soluzione
Questo elenca tutti i file (e solo i file) nella directory corrente:
for /r %i in (*) do echo %i
Inoltre, se si esegue quel comando in un file batch, è necessario raddoppiare i segni%.
for /r %%i in (*) do echo %%i
(grazie @agnul)
Altri suggerimenti
Passa da ...
- ... file nella directory corrente:
for %f in (.\*) do @echo %f
- ... subdir nella directory corrente:
for /D %s in (.\*) do @echo %s
- ... file nell'attuale e in tutti i sottodirectory:
for /R %f in (.\*) do @echo %f
- ... sottodirizzi nell'attuale e in tutti i sotto-sotto:
for /R /D %s in (.\*) do @echo %s
Sfortunatamente non ho trovato alcun modo per scorrere contemporaneamente su file e sottodirectory.
Usa cygwin con il suo bash per molte più funzionalità.
A parte questo: hai notato che l'aiuto integrato di MS Windows è una grande risorsa per le descrizioni della sintassi della riga di comando di cmd?
Dai anche un'occhiata qui: http://technet.microsoft.com/ it-it / library / bb490890.aspx
Esiste una sottile differenza tra l'esecuzione di FOR
dalla riga di comando e da un file batch. In un file batch, devi mettere due %
caratteri davanti a ogni riferimento di variabile.
Da una riga di comando:
FOR %i IN (*) DO ECHO %i
Da un file batch:
FOR %%i IN (*) DO ECHO %%i
Per scorrere su ogni file funzionerà un ciclo for:
for %%f in (directory\path\*) do ( something_here )
Nel mio caso volevo anche il contenuto del file, il nome, ecc.
Questo ha portato ad alcuni problemi e ho pensato che il mio caso d'uso potesse aiutare. Ecco un ciclo che legge le informazioni da ciascun file '.txt' in una directory e ti permette di fare qualcosa con esso (setx per esempio).
@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (directory\path\*.txt) do (
set /p val=<%%f
echo "fullname: %%f"
echo "name: %%~nf"
echo "contents: !val!"
)
* Limitazione: val < = %% f otterrà solo la prima riga del file.
Questo for-loop elencherà tutti i file in una directory.
pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd
quot &; & Delims = quot; è utile per mostrare nomi di file lunghi con spazi ....
'/ b quot &; mostra solo nomi, non dimensioni date ecc.
Alcune cose da sapere sull'argomento di dir / a.
- Qualsiasi uso di " / a " elencherebbe tutto, inclusi gli attributi nascosti e di sistema. &
- quot; / annuncio quot &; mostrerebbe solo le sottodirectory, comprese quelle nascoste e di sistema.
- quot &; & / A-d quot; L'argomento elimina il contenuto con l'attributo 'D'irectory.
- quot &; / A-d-h-s quot &; mostrerà tutto, ma le voci con 'D'irectory, attributo' H'idden 'S'ystem.
Se lo usi dalla riga di comando, rimuovi un "% " ;.
Spero che questo aiuti.
% 1 si riferisce al primo argomento passato e non può essere utilizzato in un iteratore.
Prova questo:
@echo off
for %%i in (*.*) do echo %%i
for %1 in (*.*) do echo %1
Prova " AIUTO PER " in cmd per una guida completa
Questa è la guida per i comandi XP. http://www.ss64.com/nt/
Il codice seguente crea un file denominato "AllFilesInCurrentDirectorylist.txt" nella directory corrente, che contiene l'elenco di tutti i file ( Solo file) nella directory corrente. Dai un'occhiata
dir /b /a-d > AllFilesInCurrentDirectorylist.txt
Potrebbe anche utilizzare il comando forfiles :
forfiles /s
e controlla anche se si tratta di una directory
forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"
Vorrei usare vbscript (Windows Scripting Host), perché in batch sono sicuro che non si può dire che un nome è un file o una directory.
In vbs, può essere qualcosa del genere:
Dim fileSystemObject
Set fileSystemObject = CreateObject("Scripting.FileSystemObject")
Dim mainFolder
Set mainFolder = fileSystemObject.GetFolder(myFolder)
Dim files
Set files = mainFolder.Files
For Each file in files
...
Next
Dim subFolders
Set subFolders = mainFolder.SubFolders
For Each folder in subFolders
...
Next
Controlla FileSystemObject su MSDN .
Uso il comando xcopy con l'opzione / L per ottenere i nomi dei file. Quindi se vuoi ottenere una directory o tutti i file nella sottodirectory puoi fare qualcosa del genere:
for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a
Uso semplicemente c: \ come destinazione perché esiste sempre sui sistemi Windows e non sta copiando, quindi non importa. se vuoi anche le sottodirectory, usa l'opzione / s alla fine. Puoi anche usare gli altri switch di xcopy se ne hai bisogno per altri motivi.
Prova questo per verificare se un file è una directory:
FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory
Questo ti dirà solo se un file NON è una directory, il che sarà vero anche se il file non esiste, quindi assicurati di verificarlo prima se necessario. I carets (^) vengono utilizzati per sfuggire ai simboli di reindirizzamento e l'output dell'elenco file viene reindirizzato a NUL per impedirne la visualizzazione, mentre l'output dell'errore dell'elenco DIR viene reindirizzato all'output in modo da poter testare il messaggio DIR & Quot ; File Not Found & Quot ;.
prova questo:
::Example directory
set SetupDir=C:\Users
::Loop in the folder with "/r" to search in recursive folders, %%f being a loop ::variable
for /r "%SetupDir%" %%f in (*.msi *.exe) do set /a counter+=1
echo there are %counter% files in your folder
conta i file .msi ed .exe nella tua directory (e nella sottodirectory). Quindi fa anche la differenza tra cartelle e file come eseguibili.
Basta aggiungere un'estensione (.pptx .docx ..) se è necessario filtrare altri file nel ciclo
Nel mio caso ho dovuto eliminare tutti i file e le cartelle sotto una cartella temporanea. Quindi è così che ho finito per farlo. Ho dovuto eseguire due loop uno per il file e uno per le cartelle. Se i file o le cartelle hanno spazi nei loro nomi, devi usare & Quot; quot &;
cd %USERPROFILE%\AppData\Local\Temp\
rem files only
for /r %%a in (*) do (
echo deleting file "%%a" ...
if exist "%%a" del /s /q "%%a"
)
rem folders only
for /D %%a in (*) do (
echo deleting folder "%%a" ...
if exist "%%a" rmdir /s /q "%%a"
)
Per scorrere tutti i file e le cartelle puoi utilizzare
for /F "delims=" %%a in ('dir /b /s') do echo %%a
Per iterare solo tutte le cartelle non con i file, è possibile utilizzare
for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a
Dove /s
fornirà tutti i risultati nell'intero albero delle directory in profondità illimitata. Puoi saltare /AD
se desideri scorrere il contenuto di quella cartella e non la sua sottocartella
Implementazione della ricerca nell'iterazione
Per iterare attraverso un determinato file e cartella denominati puoi cercare il nome e iterare usando il ciclo
for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a
Per iterare attraverso particolari cartelle / directory denominate e non file , quindi utilizzare <=> con lo stesso comando
for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a
Ho avuto difficoltà a far funzionare la risposta di jop con un percorso assoluto finché non ho trovato questo riferimento: https: / /ss64.com/nt/for_r.html
Il seguente esempio scorre tutti i file in una directory fornita dal percorso assoluto.
For /R C:\absoulte\path\ %%G IN (*.*) do (
Echo %%G
)