windows bat - 使用'for'循環遍歷目錄中的所有文件





files through (13)


迭代每個文件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只會得到文件的第一行。

我如何使用for循環迭代目錄中的每個文件?

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




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

嘗試這個:

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



它也可以使用forfiles命令:

forfiles /s 

並檢查它是否是一個目錄

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



以下代碼在當前目錄中創建一個名為“AllFilesInCurrentDirectorylist.txt”的文件,其中包含當前目錄中所有文件(僅限文件)的列表。 一探究竟

dir /b /a-d > AllFilesInCurrentDirectorylist.txt



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

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

我只是使用c:\​​作為目的地,因為它始終存在於Windows系統上,並且不會被複製,因此無關緊要。 如果你希望子目錄也只是在最後使用/ s選項。 如果您因其他原因需要它們,您也可以使用xcopy的其他開關。




嘗試這個:

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




我會使用vbscript(Windows Scripting Host),因為在批處理中,我確信你不能說名稱是文件或目錄。

在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

在MSDN上檢查FileSystemObject




在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

我只注意到你問了一些關於批處理的問題 ,我誤解為bash 。 這個答案可能因此不適合你的問題。




試試這個來測試一個文件是否是一個目錄:

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 “。




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

在cmd中嘗試“幫助”以獲取完整指南

這是XP命令的指南。 http://www.ss64.com/nt/




這個for-loop將列出目錄中的所有文件。

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

“delims =”對於顯示帶有空格的長文件名很有用....

'/ b“只顯示名字,而不是大小日期等。

有些事情要了解dir的論點。

  • 任何使用“/ a”都會列出所有內容,包括隱藏和系統屬性。
  • “/ ad”只會顯示子目錄,包括隱藏目錄和系統目錄。
  • “/ ad”參數消除了'D'irectory屬性的內容。
  • “/ adhs”將顯示所有內容,但具有'D'irectory','H'idden''系統屬性的條目。

如果你在命令行中使用它,請刪除“%”。

希望這可以幫助。




這列出了當前目錄中的所有文件(僅限文件):

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

另外,如果您在批處理文件中運行該命令,則需要將%符號加倍。

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

(謝謝​​@agnul)




@ECHO OFF
rem next line removes all files in temp folder
DEL /A /F /Q /S "%temp%\*.*"
rem next line cleans up the folder's content
FOR /D %%p IN ("%temp%\*.*") DO RD "%%p" /S /Q




windows batch-file for-loop cmd