首页 文章

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

提问于
浏览
275

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

如何判断某个条目是某个目录还是仅仅是一个文件?

15 回答

  • 2

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

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

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

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

    (谢谢@agnul)

  • 0

    迭代...

    • ...当前目录中的文件: 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的构建帮助是描述cmd命令行语法的重要资源?

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

  • 191

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

    从命令行:

    FOR %i IN (*) DO ECHO %i
    

    从批处理文件:

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

    此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属性 .

    如果在命令行上使用此选项,请删除“%” .

    希望这可以帮助 .

  • 40

    To iterate over each file a for loop will work:

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

    In my case I also wanted the file content, name, etc.

    这导致一些问题,我认为我的用例可能会有所帮助 . 这是一个循环,它从目录中的每个'.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只会获取文件的第一行 .

  • 10

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

  • 5

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

    试试这个:

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

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

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

  • 3

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

    dir /b /a-d > AllFilesInCurrentDirectorylist.txt
    
  • 40

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

  • 2

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

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

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

  • 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的消息“找不到文件” ” .

  • 2

    它也可以使用forfiles命令:

    forfiles /s
    

    并检查它是否是一个目录

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

    试试这个:

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

  • 2

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

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

相关问题