使用'for'循环迭代目录中的所有文件

时间:2008-09-26 09:42:34

标签: windows batch-file for-loop cmd

如何使用for循环遍历目录中的每个文件?

我怎么能判断某个条目是某个目录还是只是一个文件?

17 个答案:

答案 0 :(得分:429)

列出当前目录中的所有文件(以及仅文件):

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

此外,如果您在批处理文件中运行该命令,则需要将%符号加倍。

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

(谢谢@agnul)

答案 1 :(得分:198)

迭代......

  • ...当前目录中的文件: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

答案 2 :(得分:55)

从命令行运行FOR和批处理文件之间存在细微差别。在批处理文件中,您需要在每个变量引用前放置两个%个字符。

从命令行:

FOR %i IN (*) DO ECHO %i

从批处理文件:

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

答案 3 :(得分:47)

要迭代每个文件,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&lt; = %% f只会获取文件的第一行。

答案 4 :(得分:40)

此for循环将列出目录中的所有文件。

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

“delims =”对于显示包含空格的长文件名非常有用....

'/ b“仅显示名称,而不显示大小日期等。

关于dir / a argument的一些事情。

  • 任何使用“/ a”都会列出所有内容,包括隐藏和系统属性。
  • “/ ad”只会显示子目录,包括隐藏目录和系统目录。
  • “/ a-d”参数使用'D'irectory属性消除内容。
  • “/ a-d-h-s”会显示所有内容,但是带有'D'irectory,'H'idden'S'ystem属性的条目。

如果您在命令行上使用此功能,请删除“%”。

希望这有帮助。

答案 5 :(得分:10)

%1指的是传入的第一个参数,不能在迭代器中使用。

试试这个:

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

答案 6 :(得分:5)

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

在cmd中尝试“帮助”获取完整指南

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

答案 7 :(得分:3)

以下代码在当前目录中创建名为 “AllFilesInCurrentDirectorylist.txt” 的文件,其中包含当前目录中所有文件(仅文件)的列表。看看

dir /b /a-d > AllFilesInCurrentDirectorylist.txt

答案 8 :(得分:3)

它也可以使用forfiles命令:

forfiles /s 

并检查它是否是目录

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

答案 9 :(得分:2)

这是我的代码中的注释。

我只是通过biatch技巧来复习,所以请原谅任何明显的错误。

我试图在用户需要的地方稍加修改,尽力编写一个全解决方案。

一些重要说明:如果只希望处理根目录文件和文件夹,只需将变量recursive更改为FALSE。否则,它将遍历所有文件夹和文件。

C&C最受欢迎...

@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

答案 10 :(得分:2)

试试这个:

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

答案 11 :(得分:2)

我使用带有/ L选项的xcopy命令来获取文件名。因此,如果您想要获取目录或子目录中的所有文件,您可以执行以下操作:

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

我只是使用c:\​​作为目标,因为它始终存在于Windows系统上,并且它不是复制所以无关紧要。如果你想要子目录也只是在末尾使用/ s选项。如果由于其他原因需要,您也可以使用xcopy的其他开关。

答案 12 :(得分: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的消息“找不到文件” ”

答案 13 :(得分:2)

我会使用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

检查FileSystemObject on MSDN

答案 14 :(得分:1)

就我而言,我必须删除临时文件夹下的所有文件和文件夹。所以这就是我最终做的方式。我不得不运行两个循环,一个用于文件,一个用于文件夹。如果文件或文件夹的名称中包含空格,则必须使用“”

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

答案 15 :(得分:1)

遍历所有文件和文件夹,您可以使用

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

仅遍历所有文件夹而不包含文件,则可以使用

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

/s将以无限深度给出整个目录树中的所有结果。如果要遍历该文件夹而不是其子文件夹的内容,则可以跳过/s

在迭代中实现搜索

遍历特定的命名文件和文件夹,您可以搜索名称并使用for循环进行迭代

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

遍历特定的命名文件夹/目录而不是文件,然后在同一命令中使用/AD

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

答案 16 :(得分:0)

在找到以下引用之前,我很难获得jop的答案才能使用绝对路径:https://ss64.com/nt/for_r.html

下面的示例遍历绝对路径给定目录中的所有文件。

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