【问题标题】:batch file Copy files with certain extensions from multiple directories into one directory批处理文件从多个目录复制具有特定扩展名的文件到一个目录
【发布时间】:2009-08-03 22:11:23
【问题描述】:

我是新手,所以请耐心等待......

我正在尝试使用批处理文件将分散在一个主目录的多个子目录中的所有.doc 文件复制到另一个目录中。我已经设法从我想要复制的这些目录中获取所有文件(有数百个)的filelist.txt

"C:\Main directory\sub directory" dir /b /s *.doc > "C:\Main directory\sub directory\filelist.txt"

我会使用什么脚本将它们复制到一个目录中?我可以使用一些代码从filelist.txt 中获取这些文件名并复制它们吗?

作为参考,我查看了下面的问题,因为它看起来像是在做我想做的事,但对我没有用。

Using xcopy to copy files from several directories to one directory

另外,我真的很想了解这个概念,所以请分解代码让我告诉我每个项目的作用,或者至少包含一个可以解释它的链接。

【问题讨论】:

  • 在 Windows 资源管理器中打开主目录,搜索 *.doc,全选 (Ctrl+A) 并将它们复制/粘贴到新目录...我最初也为此转到 cmd 行,但 GUI 解决方案要快得多:)
  • 我认为你可以搜索 *.doc 并复制结果!
  • 使用这个答案复制子文件夹stackoverflow.com/a/26421140/3197387
  • 使用这个答案复制onli文件stackoverflow.com/a/1224932/3197387

标签: windows batch-file command-prompt xcopy .doc


【解决方案1】:

在批处理文件中解决方案

for /R c:\source %%f in (*.xml) do copy %%f x:\destination\

代码就是这样工作的;

对于目录c:\source 中的每个文件for 和匹配模式(\*.xml) 的子目录/R 将文件名放入变量%%f,然后对于每个文件do 复制文件copy %%f 到目标@ 987654329@

刚刚在我的 Windows XP 计算机上对其进行了测试,它对我来说就像是一种享受。但我将它输入到命令提示符中,所以我使用了单个 %f 变量名称版本,如上面链接问题中所述。

【讨论】:

  • 如果exe名称中包含空格,您将如何解决问题?
  • @Euclid 从我的头顶上掉下来我会将最后的 %%f 更改为 '%%f' 以保护空间
  • 非常感谢。我们将如何在保留它来自的文件夹的同时做到这一点?示例:将文件保留在其文件夹名称和树结构中
  • 您必须注意不同子文件夹中具有相同名称的文件。您将只有其中一个的副本。
  • @user1456962 这可以通过稍微复杂一点的脚本来完成,该脚本将完整路径保存到变量中,用新路径替换其中的字符,然后复制到新路径。或者,或者,使用调用自身的批处理文件自己进行递归,并“提交”当前正在使用的子目录。
【解决方案2】:

只需使用带有递归选项的 XCOPY 命令

xcopy c:\*.doc k:\mybackup /sy

/s 将使其“递归”

【讨论】:

  • 但是如果其中的文件是c: 的子文件夹,那么它还会复制子文件夹和.doc 文件......而不是没有子文件夹的文件本身
  • 很高兴为您提供一些额外的代表。如果有一个像这样运行良好的内置函数,我宁愿不编写脚本。
【解决方案3】:

这些是我改用 Powershell 的原因。试试看,很有趣:

Get-ChildItem -Recurse -Include *.doc | % {
    Copy-Item $_.FullName -destination x:\destination
}

【讨论】:

  • 您实际上可以只做gci -rec -inc *.doc | cp -dest X:\Destination,因为Copy-Item 接受管道输入。你也可以完全摆脱Get-ChildItem,只做Copy-Item -Recurse -Include *.doc -Destination C:\Destination,因为Copy-Item也有-Recurse-Include
  • 这会保留子文件夹结构吗?好像没有
  • @Joey 第一个建议奏效,第二个询问“为以下参数提供值:”。尝试将 Recurse 移至结束,然后开始查看 Get-Help Copy-Item -Detailed,然后决定我应该尝试您的第一个建议。 ;)
  • 为了移动文件,可以像这样修改乔伊的解决方案gci -rec -inc *.doc | mv -dest X:\Destination
  • 如果我想包含多个不同的扩展怎么办?喜欢 png 和 jpg 和 gif?
【解决方案4】:

布兰登,短而甜美。也很灵活。

set dSource=C:\Main directory\sub directory
set dTarget=D:\Documents
set fType=*.doc
for /f "delims=" %%f in ('dir /a-d /b /s "%dSource%\%fType%"') do (
    copy /V "%%f" "%dTarget%\" 2>nul
)

希望这会有所帮助。

我会在复制之后添加一些检查(使用'||'),但我不确定“复制/v”在遇到错误时如何反应。

你可能想试试这个:

copy /V "%%f" "%dTarget%\" 2>nul|| echo En error occured copying "%%F".&& exit /b 1

作为复制行。如果您从中得到什么,请告诉我(无法测试复制失败的atm ..)

【讨论】:

    【解决方案5】:

    你也可以使用 vbscript

    Set objFS = CreateObject("Scripting.FileSystemObject")
    strFolder = "c:\test"
    strDestination = "c:\tmp\"
    Set objFolder = objFS.GetFolder(strFolder)
    
    Go(objFolder)
    
    Sub Go(objDIR)
      If objDIR <> "\System Volume Information" Then
        For Each eFolder in objDIR.SubFolders       
            Go eFolder
        Next
        For Each strFile In objDIR.Files
            strFileName = strFile.Name
            strExtension = objFS.GetExtensionName(strFile)
            If strExtension = "doc" Then
                objFS.CopyFile strFile , strDestination & strFileName
            End If 
        Next    
      End If  
    End Sub 
    

    另存为 mycopy.vbs 并在命令行中

    c:\test> cscript /nologo mycopy.vbs
    

    【讨论】:

      【解决方案6】:

      这可以使用这个命令来完成:

      for /r "C:\source" %f in (*.doc) do @copy "%f" "C:\destination"
      

      您也可以运行这些以使其变得简单

      set source="C:\src"
      set destination="C:\dest"
      set extension=doc
      
      for /r %source% %f in (*.%extension%) do @copy "%f" %destination%
      

      如果您愿意使用文件类型复制父文件夹名称,请尝试使用此命令

      xcopy "C:\src\*.doc" "C:\dest" /sy
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-10
        • 1970-01-01
        • 1970-01-01
        • 2018-02-05
        • 1970-01-01
        • 2015-06-12
        • 2023-03-22
        • 2020-06-03
        相关资源
        最近更新 更多