'For' döngüsü kullanarak bir dizindeki tüm dosyaları yineleme


353

forDöngü kullanarak bir dizindeki her dosyayı nasıl yineleyebilirim ?

Belirli bir girişin dizin mi yoksa sadece dosya mı olduğunu nasıl anlayabilirim?


1
varsayılan pencere kabuğu anlamına geldiğini varsayarsak, yazınızı biraz daha netlik için yeniden etiketledim
David Schmitt

2
Lütfen hangi Windows sürümünü kullandığınızı da belirtin.
jop

1
Bu birbirinden bağımsız oldukları için iki ayrı soruya bölünmelidir.
julealgon

Yanıtlar:


493

Bu, geçerli dizindeki tüm dosyaları (ve yalnızca dosyaları) listeler:

for /r %i in (*) do echo %i

Ayrıca bu komutu bir toplu iş dosyasında çalıştırırsanız,% işaretlerini iki katına çıkarmanız gerekir.

for /r %%i in (*) do echo %%i

(teşekkürler @agnul)


73
Bunu yinelemeli olarak kullanmak istemiyorsanız, / r
jocull

28
Yalnızca geçerli dizine (yinelemeli) kendi uzantıları ile dosya adlarını (tam yol) echo istiyorsanız, bunu şöyle yapabilirsiniz: for /r %i in (*) do ( echo %~nxi ). Bu konu da gerçekten yararlı olabilir: stackoverflow.com/questions/112055/… .
Sk8erPeter

2
@Vakcano evet, Do'dan sonra parantez kullanın. Yani (echo% i & del% i). Birden çok komut için "&" yerine "enter" da kullanabilirsiniz.
Jay

2
Yankı yerine kopyala / taşı gibi komutlar kullanıyorsanız, yolu doğru şekilde belirttiğinizden emin olun. / r %% i için (*) "%% i" yankısını yap
Soundararajan

2
Görünüşe göre tek harfli değişken adları kullanmanız gerekiyor.
Álvaro González

214

Yineleme ...

  • ... geçerli dizindeki dosyalar: for %f in (.\*) do @echo %f
  • ... geçerli dizindeki alt dizinler: for /D %s in (.\*) do @echo %s
  • ... geçerli ve tüm alt dizinlerdeki dosyalar: for /R %f in (.\*) do @echo %f
  • ... geçerli alt dizinleri ve tüm alt dizinleri: for /R /D %s in (.\*) do @echo %s

Ne yazık ki dosyalar ve alt dizinler üzerinde aynı anda yineleme yapmanın bir yolunu bulamadım.

Çok daha fazla işlevsellik için sadece bass ile cygwin kullanın .

Bunun dışında: MS Windows'un buildin yardımının cmd'nin komut satırı sözdiziminin açıklamaları için mükemmel bir kaynak olduğunu fark ettiniz mi?

Ayrıca buraya bir göz atın: http://technet.microsoft.com/en-us/library/bb490890.aspx


21
%fileve %subdirsadece yani uzun bir karakter olabilir %f, %s.
Felix Dombek

1
'geçerli dizindeki alt dizinler' çalışmıyor. Bir hata alıyorum: s şu anda beklenmedikti
Migrate2Lazarus profilime bak

78

Her dosya üzerinde yineleme yapmak için bir for döngüsü çalışır:

for %%f in (directory\path\*) do ( something_here )

Benim durumumda da dosya içeriğini, adını vb. İstedim.

Bu birkaç soruna yol açtı ve kullanım durumumun yardımcı olabileceğini düşündüm. Bir dizindeki her '.txt' dosyasından bilgi okuyan ve onunla bir şeyler yapmanıza izin veren bir döngü (örneğin setx).

@ECHO OFF
setlocal enabledelayedexpansion
for %%f in (directory\path\*.txt) do (
  set /p val=<%%f
  echo "fullname: %%f"
  echo "name: %%~nf"
  echo "contents: !val!"
)

* Sınırlama: val <= %% f, dosyanın yalnızca ilk satırını alır.


18
Ah, çok satırlı bir örnek. Bunun için teşekkürler!
Nyerguds

@Aaron Votre Döngü nasıl sona erdirilir?
nijogeorgep

@nijogeorgep Döngüyü "sonlandırmak" zorunda değilsiniz. Örneğimde, dizindeki her '* .txt' dosyası için parantez içindeki (echo, etc) her şey bir kez çalıştırılacaktır. Aradığınız cevabın burada daha iyi açıklanabileceğini düşünüyorum: stackoverflow.com/questions/1355791/…
Aaron Votre

@Aaron Votre Komut dosyasını kullanarak bazı maven komutlarını çalıştırmaya çalışıyordum, ama sonsuz döngü olarak çalışıyordu, bu yüzden istedim. Şimdi satın alın
döngüme

@nijogeorgep Bunu çözmene sevindim!
Aaron Votre

57

FORKomut satırından ve bir toplu iş dosyasından çalıştırma arasında küçük bir fark vardır . Bir toplu iş dosyasında, %her değişken başvurusunun önüne iki karakter koymanız gerekir .

Bir komut satırından:

FOR %i IN (*) DO ECHO %i

Bir toplu iş dosyasından:

FOR %%i IN (*) DO ECHO %%i

44

Bu for-loop bir dizindeki tüm dosyaları listeler.

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

"delims =" içindeki boşluklarla uzun dosya adlarını göstermek için kullanışlıdır ....

'/ b "boyut adlarını değil, yalnızca adları gösterir.

Dir / argüman hakkında bilinmesi gereken bazı şeyler.

  • Herhangi bir "/ a" kullanımı gizli ve sistem özellikleri dahil her şeyi listeler.
  • "/ ad" yalnızca gizli ve sistem olanlar da dahil olmak üzere alt dizinleri gösterir.
  • "/ ad" argümanı 'D'irectory özniteliğine sahip içeriği ortadan kaldırır.
  • "/ adhs" her şeyi gösterir, ancak 'D'irectory,' H'idden 'S'ystem özelliğine sahip girişler gösterir.

Bunu komut satırında kullanırsanız, bir "%" işaretini kaldırın.

Bu yardımcı olur umarım.


10

% 1, iletilen ilk bağımsız değişkeni ifade eder ve bir yineleyicide kullanılamaz.

Bunu dene:

@echo off
for %%i in (*.*) do echo %%i

Haklısın. Ben anında modda FOR sözdizimini kontrol etmek için denedim ve doğrudan parametreleri hakkında unutmadan cevap satır yapıştırılan :-)
Axeman


4

İçin tüm dosya ve klasörler arasında yineleme kullanabilirsiniz

for /F "delims=" %%a in ('dir /b /s') do echo %%a

İçin yalnızca tüm klasörler arasında yineleme dosyaları ile değil, o zaman kullanabilirsiniz

for /F "delims=" %%a in ('dir /a:d /b /s') do echo %%a

Nerede /sdizin ağacı boyunca tüm sonuçları sınırsız derinlikte verecektir. /sAlt klasörlerini değil, o klasörün içeriğini yinelemek istiyorsanız atlayabilirsiniz.

Aramayı yinelemede uygulama

To yineleme adlı dosya ve klasörleri belirli aracılığıyla Adından arayabilir ve tekrarlayın döngü kullanarak

for /F "delims=" %%a in ('dir "file or folder name" /b /s') do echo %%a

To yineleme adlı klasör / dizin değil dosyalar belirli aracılığıyla , daha sonra kullanmak /ADaynı komuta

for /F "delims=" %%a in ('dir "folder name" /b /AD /s') do echo %%a

4

Bu referansı bulana kadar jop'un cevabını mutlak bir yolla çalışmakta sorun yaşadım: https://ss64.com/nt/for_r.html

Aşağıdaki örnek, mutlak yol tarafından verilen bir dizindeki tüm dosyalar arasında geçiş yapar.

For /R C:\absoulte\path\ %%G IN (*.*) do (
  Echo %%G
)

3

Aşağıdaki kod , geçerli Dizinde "AllFilesInCurrentDirectorylist.txt" adlı bir dosya oluşturur ve bu dosya , geçerli Dizindeki tüm dosyaların listesini (Yalnızca Dosyalar) içerir. Bunu kontrol et

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

3

Ayrıca forfiles komutunu da kullanabilir :

forfiles /s 

ve ayrıca bir dizin olup olmadığını kontrol edin

forfiles /p c:\ /s /m *.* /c "cmd /c if @isdir==true echo @file is a directory"

@isdir==trueihtiyacı olması@isdir==TRUE
psyklopz

2

Toplu olarak bir adın bir dosya veya dizin olduğunu söyleyemeyeceğiniz için vbscript (Windows Scripting Host) kullanırım.

VBS'de, böyle bir şey olabilir:

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

MSDN'de FileSystemObject öğesini kontrol edin .


Bunu yapmak için perl kullanırdım. Ne yazık ki, bu bana bağlı değil.
Vhaerun

Bazı eski uygulamalar? Üzücü şeyler.
Biri

Bir salak geliştirici toplu iş dosyalarını gördü ve bunların tüm sorunlarımızın tedavisi olduğunu düşündü.
Vhaerun

1
@Vhaerun Windows Komut Dosyası Ana Bilgisayarının (WSH) Perl'e göre bir avantajı, WSH'nin tüm Windows sürümleriyle önceden yüklenmiş olarak gelmesidir, oysa Perl ayrı olarak yüklenmelidir, bu da her durumda uygulanabilir bir seçenek olabilir veya olmayabilir.
Parampreet Dhatt

2

Dosya adlarını almak için / L seçeneği ile xcopy komutunu kullanıyorum. Bir dizin veya alt dizindeki tüm dosyaları almak istiyorsanız, şöyle bir şey yapabilirsiniz:

for /f "delims=" %%a IN ('xcopy "D:\*.pdf" c:\ /l') do echo %%a

Ben sadece c: \ hedef olarak kullanıyorum çünkü her zaman windows sistemlerinde var ve kopyalama değil, bu yüzden önemli değil. alt dizinleri de istiyorsanız sadece / s seçeneğini kullanın. Başka nedenlerle ihtiyacınız varsa, diğer xcopy anahtarlarını da kullanabilirsiniz.


2

Bir dosyanın bir dizin olup olmadığını test etmek için bunu deneyin:

FOR /F "delims=" %I IN ('DIR /B /AD "filename" 2^>^&1 ^>NUL') DO IF "%I" == "File Not Found" ECHO Not a directory

Bu sadece bir dosyanın bir dizin DEĞİL olup olmadığını söyleyecektir, eğer dosya yoksa doğru da olacaktır, bu yüzden eğer gerekiyorsa önce bunu kontrol ettiğinizden emin olun. İşaretler (^) yönlendirme sembollerinden kaçmak için kullanılır ve dosya listeleme çıktısı görüntülenmesini önlemek için NUL'a yönlendirilirken, DIR listesinin hata çıktısı çıktıya yeniden yönlendirilir, böylece DIR mesajına karşı test edebilirsiniz "Dosya Bulunamadı ".


2

bunu dene:

::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

dizininizdeki (ve alt dizindeki) .msi ve .exe dosyalarını sayar. Böylece klasörler ve dosyalar arasında yürütülebilir olarak fark yaratır.

Döngüdeki diğer dosyaları filtrelemeniz gerekiyorsa bir uzantı (.pptx .docx ..) eklemeniz yeterlidir


1

Benim durumumda bir geçici klasörün altındaki tüm dosyaları ve klasörleri silmek zorunda kaldım. Böylece işimi böyle yaptım. Biri dosya ve diğeri klasörler için iki döngü çalıştırmak zorunda kaldım. Dosya veya klasörlerin adlarında boşluk varsa ""

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"
)

1

İşte benim kod yorumları ile benim gitmek.

Ben sadece biatch becerileri ile fırçalama yani açık hataları affet.

Kullanıcının ihtiyaç duyduğu küçük bir değişiklikle olabildiğince iyi bir çözüm yazmaya çalıştım.

Bazı önemli notlar: Sadece değişken değiştirmek recursiveiçin FALSEsadece işlenmiş kök dizinleri dosya ve klasörleri istiyorum. Aksi takdirde, tüm klasörler ve dosyalar üzerinden geçer.

C & C en hoş geldiniz ...

@echo off
title %~nx0
chcp 65001 >NUL
set "dir=c:\users\%username%\desktop"
::
:: Recursive Loop routine - First Written by Ste on - 2020.01.24 - Rev 1
::
setlocal EnableDelayedExpansion
rem THIS IS A RECURSIVE SOLUTION [ALBEIT IF YOU CHANGE THE RECURSIVE TO FALSE, NO]
rem By removing the /s switch from the first loop if you want to loop through
rem the base folder only.
set recursive=TRUE
if %recursive% equ TRUE ( set recursive=/s ) else ( set recursive= )
endlocal & set recursive=%recursive%
cd /d %dir%
echo Directory %cd%
for %%F in ("*") do (echo    → %%F)                                 %= Loop through the current directory. =%
for /f "delims==" %%D in ('dir "%dir%" /ad /b %recursive%') do (    %= Loop through the sub-directories only if the recursive variable is TRUE. =%
  echo Directory %%D
  echo %recursive% | find "/s" >NUL 2>NUL && (
    pushd %%D
    cd /d %%D
    for /f "delims==" %%F in ('dir "*" /b') do (                      %= Then loop through each pushd' folder and work on the files and folders =%
      echo %%~aF | find /v "d" >NUL 2>NUL && (                        %= This will weed out the directories by checking their attributes for the lack of 'd' with the /v switch therefore you can now work on the files only. =%
      rem You can do stuff to your files here.
      rem Below are some examples of the info you can get by expanding the %%F variable.
      rem Uncomment one at a time to see the results.
      echo    → %%~F           &rem expands %%F removing any surrounding quotes (")
      rem echo    → %%~dF          &rem expands %%F to a drive letter only
      rem echo    → %%~fF          &rem expands %%F to a fully qualified path name
      rem echo    → %%~pF          &rem expands %%A to a path only
      rem echo    → %%~nF          &rem expands %%F to a file name only
      rem echo    → %%~xF          &rem expands %%F to a file extension only
      rem echo    → %%~sF          &rem expanded path contains short names only
      rem echo    → %%~aF          &rem expands %%F to file attributes of file
      rem echo    → %%~tF          &rem expands %%F to date/time of file
      rem echo    → %%~zF          &rem expands %%F to size of file
      rem echo    → %%~dpF         &rem expands %%F to a drive letter and path only
      rem echo    → %%~nxF         &rem expands %%F to a file name and extension only
      rem echo    → %%~fsF         &rem expands %%F to a full path name with short names only
      rem echo    → %%~dp$dir:F    &rem searches the directories listed in the 'dir' environment variable and expands %%F to the fully qualified name of the first one found. If the environment variable name is not defined or the file is not found by the search, then this modifier expands to the empty string
      rem echo    → %%~ftzaF       &rem expands %%F to a DIR like output line
      )
      )
    popd
    )
  )
echo/ & pause & cls
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.