使用for循环遍历目录中的所有文件

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

我怎么能告诉如果某个条目是一个目录,或者如果它只是一个文件?

这列出了当前目录中的所有文件(只有文件):

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

另外,如果您在batch file中运行该命令,则需要将%符号加倍。

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

(谢谢@agnul)

通过迭代…

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

不幸的是,我没有find任何方式来同时迭代文件和子目录。

只需使用它的bash的cygwin更多的function。

除此之外:你有没有注意到,MS Windows的buildin帮助是描述cmd命令行语法的一个很好的资源?

也看看这里: http : //technet.microsoft.com/en-us/library/bb490890.aspx

运行FOR从命令行和batch file之间有细微的差别。 在batch file中,您需要在每个variables引用之前放置两个%字符。

从命令行:

 FOR %i IN (*) DO ECHO %i 

从batch file:

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

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

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

“delims =”对于显示带有空格的长文件名很有用。

'/ b“只显示名字,不是大小date等。

有些事情要了解dir的论点。

  • 任何使用“/ a”都会列出所有内容,包括隐藏和系统属性。
  • “/ ad”只会显示子目录,包括隐藏的和系统的。
  • “/ ad”参数消除了“D'irectory”属性的内容。
  • “/ adhs”将显示所有内容,但具有“D'irectory”,“Hidden”的系统属性。

如果你在命令行中使用这个,删除一个“%”。

希望这可以帮助。

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

在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 。 这个答案可能因此不适合你的问题。

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

尝试这个:

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

在cmd中尝试“HELP FOR”以获取完整指南

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

以下代码在当前目录中创build一个名为“AllFilesInCurrentDirectorylist.txt”的文件,其中包含当前目录中所有文件(仅限文件)的列表。 一探究竟

 dir /b /ad > AllFilesInCurrentDirectorylist.txt 

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

我使用xcopy命令和/ L选项来获取文件名。 所以,如果你想得到一个目录或子目录中的所有文件,你可以这样做:

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

我只是使用c:\​​作为目的地,因为它始终存在于Windows系统上,而不是复制,所以没关系。 如果你想要的子目录也只是在最后使用/ s选项。 如果您因为其他原因需要它们,您也可以使用xcopy的其他开关。

试试这个来testing一个文件是否是一个目录:

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

这只会告诉你一个文件是不是一个目录,如果该文件不存在,这也是真的,所以如果你需要的话,一定要先检查一下。 脱字符(^)用于转义redirect符号,文件列表输出被redirect到NUL以防止显示,而DIR列表的错误输出被redirect到输出,所以你可以testingDIR的消息“File Not Found ”。

它也可以使用forfiles命令:

 forfiles /s 

并检查它是否是一个目录

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

尝试这个:

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