2008-09-26 272 views
254

如何使用for循環遍歷目錄中的每個文件?使用'for'循環遍歷目錄中的所有文件

我怎麼能告訴如果某個條目是一個目錄或者它只是一個文件?

+0

假設你的意思是默認的Windows外殼來過濾其他文件,我已經重新標記您的文章更加清晰了一點點 – 2008-09-26 09:54:16

+2

還請指定您正在使用的Windows版本。 – jop 2008-09-26 11:15:36

+1

這應該分爲兩個單獨的問題,因爲它們彼此獨立。 – julealgon 2016-11-27 23:55:01

回答

353

此列出當前目錄下的所有文件(而且只有這些文件)加倍%符號。

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

(感謝@agnul)

+0

它可能取決於您使用的操作系統,即XP/Vista/2000可能支持不同的命令行參數。 – RickL 2008-09-26 10:21:07

+55

如果你不希望遞歸使用它,請確保你取出/ r – jocull 2010-11-29 19:10:45

+16

如果你想在當前目錄(遞歸)中只回顯擴展名的文件名(不是完整路徑),你可以這樣做像這樣:`for/r%i in(*)do(echo%〜nxi)`。這個線程也可以非常有用:http://stackoverflow.com/questions/112055/what-does-d0-mean-in-a-windows-batch-file。 – Sk8erPeter 2011-12-21 21:25:06

12

在bash中,你可以做這樣的事情:

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 

我只注意到你問一批,這是我誤讀爲慶典。這個答案可能因此不適合你的問題。

10

%1引用傳入的第一個參數,不能在迭代器中使用。

試試這個:如果你運行你需要一個批處理文件,命令

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

另外:

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

你說得對。我試過在即時模式下檢查FOR語法並直接粘貼到忘記參數的答案:-) – Axeman 2008-09-26 09:55:58

2

我會使用VBScript(Windows腳本宿主),因爲在批量我敢肯定,你不能告訴一個名字是一個文件或目錄。

在VBS,也可以是這樣的:

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 

檢查FileSystemObject on MSDN

173

迭代通過......

  • ...在當前目錄下的文件:for %f in (.\*) do @echo %f
  • ...在當前目錄下的子目錄:for /D %s in (.\*) do @echo %s
  • ...在當前文件和所有子目錄:for /R %f in (.\*) do @echo %f
  • ...子目錄在當前和所有子目錄:for /R /D %s in (.\*) do @echo %s

ü不幸的是,我沒有找到任何方法來同時迭代文件和子目錄。

只需使用cygwin與其bash功能更多。

除此之外:您是否注意到,MS Windows的buildin幫助是描述cmd命令行語法的好資源?

也可以看看這裏:http://technet.microsoft.com/en-us/library/bb490890.aspx

47

有命令行,並從一個批處理文件運行FOR之間的細微差別。在批處理文件中,您需要在每個變量引用之前放置兩個%字符。

從命令行:

FOR %i IN (*) DO ECHO %i 

從一個批處理文件:

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

這for循環會列出目錄中的所有文件。

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

「delims =」是有用的,以顯示長文件名,在它的空間....

「/ B」只顯示名稱,而不是大小日期等。

有些事情要了解目錄的/一個說法。

  • 任何使用「/ A」將列出一切,包括隱藏和系統屬性的。
  • 「/廣告」只會顯示子目錄,包括隱藏的和系統的。
  • 「/ a-d」參數用'D irectory屬性消除內容。
  • 「/ a-d-h-s」將顯示所有內容,但具有'D'irectory','H'idden''系統屬性的條目。

如果您在命令行中使用此命令,請刪除「%」。

希望這會有所幫助。

3

下面的代碼創建一個名爲「AllFilesInCurrentDirectorylist.txt」在當前目錄,其中包含在當前目錄中的所有文件(僅文件)的列表中的文件。檢查出來

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

試試這個測試,如果文件是目錄:

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

這不僅會告訴你一個文件是否爲一個目錄,這也將是真實的,如果該文件沒有按不存在,所以如果你需要的話,一定要先檢查一下。脫字符(^)用於轉義重定向符號,文件列表輸出被重定向到NUL以防止顯示,而DIR列表的錯誤輸出被重定向到輸出,因此您可以根據DIR的消息「File Not Found 」。

2

我使用帶/ L選項的xcopy命令來獲取文件名。所以,如果你想獲得一個目錄或所有文件的子目錄,你可以做這樣的事情:

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

我只是使用C:\作爲目標,因爲它總是存在於Windows系統,它是不復制,所以沒關係。如果你希望子目錄也只是在最後使用/ s選項。如果您因其他原因需要它們,您也可以使用xcopy的其他開關。

2

它也可以使用forfiles命令:

forfiles /s 

,並檢查它是否是一個目錄

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

遍歷每個文件for循環將工作:

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

在我來說,我也想了文件內容,名稱等

這導致了一些問題,我想我的使用情況下,可能會有幫助。這裏是一個循環,讀取目錄中每個'.txt'文件的信息,並允許你對它做某些事情(例如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!" 
) 

*限制:VAL < = %%˚F只會獲取該文件的第一行。

1

試試這個:

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

它計算的.msi和.exe文件在目錄(和子目錄)。所以它也會將文件夾和文件作爲可執行文件進行區別。

只需添加一個擴展文件(.pptx .DOCX ..)如果你需要在循環