2008-09-26 55 views
254

Làm cách nào để lặp lại từng tệp trong thư mục bằng cách sử dụng vòng lặp for?Lặp lại tất cả các tệp trong thư mục bằng cách sử dụng vòng lặp 'for'

Và làm cách nào tôi có thể biết liệu một mục nhập nhất định có phải là một thư mục hay chỉ là một tệp?

+0

giả sử bạn có nghĩa là mặc định cửa sổ shell, tôi đã gắn thẻ bài của bạn cho một chút rõ ràng hơn –

+2

Vui lòng chỉ định phiên bản Windows bạn đang sử dụng. – jop

+1

Điều này nên được chia thành hai câu hỏi riêng biệt vì chúng độc lập với nhau. – julealgon

Trả lời

353

này liệt kê tất cả các file (và chỉ các tập tin) trong thư mục hiện:

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

Ngoài ra nếu bạn chạy lệnh này trong một tập tin batch bạn cần tăng gấp đôi dấu%.

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

(nhờ @agnul)

+0

Nó có thể phụ thuộc vào hệ điều hành bạn đang sử dụng, tức là XP/Vista/2000 có thể hỗ trợ các đối số dòng lệnh khác nhau. – RickL

+55

Nếu bạn không muốn sử dụng đệ quy này, hãy đảm bảo bạn lấy/r – jocull

+16

Nếu bạn muốn chỉ echo tên tệp (không phải đường dẫn đầy đủ) với các đuôi của chúng trong thư mục hiện tại (đệ quy), bạn có thể làm điều đó như thế này: 'for/r% i in (*) do (echo% ~ nxi)'. Chủ đề này có thể thực sự hữu ích: http://stackoverflow.com/questions/112055/what-does-d0-mean-in-a-windows-batch-file. – Sk8erPeter

12

Trong bash, bạn có thể làm điều gì đó như thế này:

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 

Tôi chỉ nhận thấy rằng bạn hỏi về batch, mà tôi không nhận định như bash. Câu trả lời này có thể không phù hợp với câu hỏi của bạn.

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

Hãy thử "giúp cho" trong cmd cho một hướng dẫn đầy đủ

Đây là hướng dẫn cho XP lệnh. http://www.ss64.com/nt/

10

% 1 đề cập đến đối số đầu tiên được chuyển vào và không thể được sử dụng trong trình lặp.

Hãy thử điều này:

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

Bạn nói đúng. Tôi đã thử ở chế độ ngay lập tức để kiểm tra cú pháp FOR và dán dòng thẳng vào câu trả lời quên thông số :-) – Axeman

2

Tôi sẽ sử dụng VBScript (Windows Scripting Host), bởi vì trong hàng loạt tôi chắc chắn rằng bạn không thể nói rằng một tên là một tập tin hoặc một thư mục.

Trong vbs, nó có thể là một cái gì đó như thế này:

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 

Kiểm tra FileSystemObject on MSDN.

+0

Tôi đã sử dụng perl để làm điều này. Thật không may, nó không tùy thuộc vào tôi. – Vhaerun

+0

Một số ứng dụng cũ? Những điều buồn. – Biri

+0

Một nhà phát triển idiot đã xem các tập tin batch và nghĩ rằng đó là cách chữa trị cho tất cả các vấn đề của chúng tôi. – Vhaerun

173

Duyệt qua ...

  • ... tập tin trong thư mục hiện hành: for %f in (.\*) do @echo %f
  • ... subdirs trong thư mục hiện hành: for /D %s in (.\*) do @echo %s
  • ... tập tin trong hiện tại và tất cả subdirs: for /R %f in (.\*) do @echo %f
  • ... subdirs trong hiện tại và tất cả subdirs: for /R /D %s in (.\*) do @echo %s

U Tôi không tìm thấy cách nào để lặp lại các tập tin và thư mục con cùng một lúc.

Chỉ cần sử dụng cygwin với dấu gạch ngang của nó để có nhiều chức năng hơn.

Ngoài ra: Bạn có nhận thấy rằng sự trợ giúp của builder trong MS Windows là một tài nguyên tuyệt vời để mô tả cú pháp dòng lệnh của cmd không?

Cũng có một cái nhìn ở đây: http://technet.microsoft.com/en-us/library/bb490890.aspx

+20

'% file' và'% subdir' chỉ có thể dài một ký tự, tức là '% f','% s'. –

+1

+1 vào tùy chọn cygwin :) – jjimenez

+0

'subdirs in dir hiện tại' không hoạt động. Tôi nhận được một lỗi: s đã bất ngờ tại thời điểm này – Ampere

47

Có một sự khác biệt tinh tế giữa chạy FOR từ dòng lệnh và từ một tập tin thực thi. Trong tệp lô, bạn cần đặt hai ký tự % vào trước mỗi tham chiếu biến.

Từ một dòng lệnh:

FOR %i IN (*) DO ECHO %i 

Từ một tập tin batch:

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

này cho vòng lặp sẽ liệt kê tất cả các file trong một thư mục.

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

"delims =" rất hữu ích để hiển thị tên tập tin dài với không gian trong nó ....

'/ b" chỉ hiển thị tên, không ngày kích thước vv ..

Một số điều cần biết về dir của/một cuộc tranh luận.

  • Bất kỳ việc sử dụng "/ a" sẽ liệt kê tất cả mọi thứ, bao gồm cả thành viên ẩn và thuộc tính hệ thống.
  • "/ quảng cáo" sẽ chỉ hiển thị các thư mục con, bao gồm cả ẩn và hệ thống. Đối số
  • "/ a-d" loại bỏ nội dung có thuộc tính 'D'irectory.
  • "/ a-d-h-s" sẽ hiển thị mọi thứ, nhưng các mục có thuộc tính 'D'irectory,' H'idden 'S'ystem.

Nếu bạn sử dụng lệnh này trên dòng lệnh, hãy xóa "%".

Hy vọng điều này sẽ hữu ích.

+2

Cảm ơn bạn đã gợi ý "delims =". Điều này làm cho ngày của tôi. – mhaller

3

Đoạn mã sau tạo một file có tên "AllFilesInCurrentDirectorylist.txt" trong Danh bạ hiện hành, trong đó có danh sách tất cả các file (Chỉ Files) trong Danh bạ hiện hành. Check it out

dir /b /a-d > AllFilesInCurrentDirectorylist.txt 
2

Hãy thử điều này để kiểm tra xem một tập tin là một thư mục:

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

này chỉ sẽ cho bạn biết một file KHÔNG phải là một thư mục, mà cũng sẽ là true nếu tập tin doesn không tồn tại, vì vậy hãy chắc chắn để kiểm tra cho rằng đầu tiên nếu bạn cần. Các dấu (^) được sử dụng để thoát khỏi các ký hiệu chuyển hướng và đầu ra danh sách tệp được chuyển hướng đến NUL để ngăn không cho nó hiển thị, trong khi đầu ra lỗi của danh sách DIR được chuyển đến đầu ra để bạn có thể kiểm tra thông báo của DIR ".

+0

có hoạt động trên các phiên bản cửa sổ ngôn ngữ khác nhau không? – didito

2

Tôi sử dụng lệnh xcopy với tùy chọn/L để lấy tên tệp. Vì vậy, nếu bạn muốn nhận được một trong hai thư mục hoặc tất cả các tập tin trong thư mục con bạn có thể làm một cái gì đó như thế này:

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

tôi chỉ sử dụng các c: \ là điểm đến bởi vì nó luôn tồn tại trên hệ thống cửa sổ và nó là không sao chép để nó không quan trọng. nếu bạn muốn các thư mục con cũng chỉ sử dụng tùy chọn/s ở cuối. Bạn cũng có thể sử dụng các thiết bị chuyển mạch khác của xcopy nếu bạn cần chúng vì những lý do khác.

2

Nó cũng có thể sử dụng forfiles lệnh:

forfiles /s 

và cũng kiểm tra nếu nó là một thư mục

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

'@ isdir == true' cần phải là' @ isdir == TRUE' – psyklopz

26

Để lặp qua từng tập tin một vòng lặp for sẽ làm việc:

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

Trong trường hợp của tôi, tôi cũng muốn các nội dung tập tin, tên, vv

Điều này dẫn đến một vài vấn đề và tôi nghĩ trường hợp sử dụng của tôi có thể giúp đỡ. Đây là một vòng lặp đọc thông tin từ mỗi tệp '.txt' trong một thư mục và cho phép bạn làm điều gì đó với nó (ví dụ 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!" 
) 

* Hạn chế: val < = %% f sẽ chỉ nhận được dòng đầu tiên của file.

+6

Ah, ví dụ về nhiều dòng. Cảm ơn vì điều đó! – Nyerguds

+0

@Aaron Votre Cách kết thúc vòng lặp? – nijogeorgep

+0

@nijogeorgep Bạn không phải "kết thúc" vòng lặp. Trong ví dụ của tôi, mọi thứ bên trong dấu ngoặc đơn, (echo, vv), sẽ được chạy một lần cho mỗi tệp '* .txt' trong thư mục. Tôi nghĩ câu trả lời bạn đang tìm kiếm có thể được giải thích rõ hơn ở đây: http://stackoverflow.com/questions/1355791/how-do-you-loop-in-a-windows-batch-file –

1

thử điều này:

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

nó đếm .msi và các file .exe trong thư mục của bạn (và trong thư mục phụ). Vì vậy, nó cũng làm cho sự khác biệt giữa các thư mục và tập tin như thực thi.

Chỉ cần thêm một phần mở rộng (.pptx .docx ..) nếu bạn cần phải lọc các file khác trong vòng lặp

Các vấn đề liên quan