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?

È stato utile?

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
)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top