使用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
以下代码在当前目录中创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 ..)