[Windows] Iterate tutti i file in una directory usando un ciclo 'for'


Answers

Passare attraverso ...

  • ... file nella directory corrente: for %f in (.\*) do @echo %f
  • ... sottodirectory nella directory corrente: for /D %s in (.\*) do @echo %s
  • ... file in current e tutti i sottodirectory: for /R %f in (.\*) do @echo %f
  • ... sottodirectory in corrente e in tutte le sottodirectory: for /R /D %s in (.\*) do @echo %s

Sfortunatamente non ho trovato alcun modo per iterare su file e sottodirectory allo stesso tempo.

Basta usare cygwin con la sua bash per molte più funzionalità.

A parte questo: avete notato che l'aiuto di build di MS Windows è una grande risorsa per le descrizioni della sintassi della riga di comando di cmd?

Date anche un'occhiata qui: http://technet.microsoft.com/en-us/library/bb490890.aspx

Question

Come posso scorrere su ogni file in una directory usando un ciclo for ?

E come potrei dire se una determinata voce è una directory o se è solo un file?




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 solo ti dirà se un file NON è una directory, che sarà anche vero se il file non esiste, quindi assicurati di controllarlo prima se è necessario. I segni di omissione (^) vengono utilizzati per sfuggire ai simboli di reindirizzamento e l'output dell'elenco file viene reindirizzato su 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 "File non trovato ".




Questo ciclo elenca tutti i file in una directory.

pushd somedir
for /f "delims=" %%f in ('dir /b /a-d-h-s') do echo %%f
popd

"delims =" è utile per mostrare nomi di file lunghi con spazi in esso ....

"/ b" mostra solo i nomi, non le date delle dimensioni, ecc.

Alcune cose da sapere su dir / un argomento.

  • Qualsiasi utilizzo di "/ a" elencherebbe tutto, inclusi gli attributi nascosti e di sistema.
  • "/ annuncio" mostrerebbe solo sottodirectory, incluse quelle nascoste e di sistema.
  • L'argomento "/ annuncio" elimina il contenuto con l'attributo D'irectory.
  • "/ adhs" mostrerà tutto, ma le voci con attributo 'D'irectory', H'idden 'S'ystem.

Se lo usi sulla riga di comando, rimuovi una "%".

Spero che questo ti aiuti.




Vorrei usare vbscript (Windows Scripting Host), perché in batch sono sicuro che non si può dire che un nome sia 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 .




In bash, potresti fare qualcosa del genere:

for fn in *; do
    if [ -d $fn ]; then
        echo "$fn is a directory"
    fi
    if [ -f $fn ]; then
        echo "$fn is a file"
    fi
done

Ho appena notato che hai chiesto del batch , che ho interpretato erroneamente come bash . Questa risposta potrebbe quindi non essere adatta alla tua domanda.




for %1 in (*.*) do echo %1

Prova "HELP FOR" in cmd per una guida completa

Questa è la guida per i comandi XP. http://www.ss64.com/nt/




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 e .exe nella tua directory (e nella sottodirectory). Così fa anche la differenza tra cartelle e file come eseguibili.

Basta aggiungere un'estensione (.pptx .docx ..) se è necessario filtrare altri file nel ciclo