从我的所有计算机复制所有类型的文件排除一些目录

时间:2016-09-14 15:59:36

标签: batch-file

我想创建一个正在执行以下操作的批处理文件,从我的所有计算机中搜索所有类型的文件,但是从搜索中排除某些目录,例如Windows或Program Files,并且只复制文件在一个文件夹中,而不是父/父目录/目录。

我试过三种方式:

首先使用ROBOCOPY命令

ROBOCOPY C:\ %location% *.jpg *.png /S /XD "Windows" "Program Files" /XJ /W:0 / R:0

它工作正常,但我不需要文件的父目录,我希望找到的所有文件都复制一个文件夹。

第二种方式是使用XCOPY

XCOPY /C /H /S /EXCLUDE: excludefiles.txt "%source%" "%destination%" 

但是同样的问题,用他们的父目录复制文件。

使用For Loop的第三种方式,我使用相同的xcopy。

FOR "eol=| delims=" %%f IN (*.jpg,*.png) DO ( XCOPY /C /H /S /EXCLUDE:excludefiles.txt "%source%\%%~nxf" "%destination%"

但同样的问题,我尝试了for循环和副本,但副本没有在子目录中搜索的选项,对我来说这也是一个问题。

所以,如果你能帮我解决这个问题,我会感谢你。

2 个答案:

答案 0 :(得分:1)

我搞砸了一下并提出了以下脚本(请参阅所有解释性rem备注):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "SOURCE=D:\"          & rem // (root directory of source location)
set "TARGET=H:\copydata\" & rem // (target location)
set PATTERNS="*.jpg","*.png"               & rem // (list of file patterns)
set EXCLUSIONS="D:\dontcopy\","\ignoreit\" & rem // (list of exclusions)
set "EXCLFILE=exclusions.lst" & rem /* (name of temporary exclusions file;
                                rem     this must not contain spaces!) */
set "EXCLFDIR=%~dp0" & rem /* (location of temporary exclusions file;
                       rem     `%~dp0` is the parent dir. of this script) */

rem // Create temporary exclusions file:
cd /D "%EXCLFDIR%"
if defined EXCLUSIONS (
    > "%EXCLFILE%" (
        for %%E in (%EXCLUSIONS%) do (
            echo(%%~E
        )
    )
    rem // Build exclusions option for `xcopy`:
    set "EXCLUSIONS=/EXCLUDE:%EXCLFILE%"
)

rem /* Create target directory to ensure it exists
rem    (if the target does not exist, `xcopy` prompts for
rem     whether it is a File or a Directory; if it exists,
rem     no prompt appears; `2> nul` surpresses error message
rem     of `md` in case the target already exists): */
2> nul md "%TARGET%"
rem // Enumerate all files in source recursively:
for /F "eol=| delims=" %%F in ('
    cd /D "%SOURCE%" ^& dir /B /S /A:-D %PATTERNS%
') do (
    rem // Do the actual flat copying here:
    (
        rem /* Surpress output (also `1 File(s)`) by `> nul`
        rem    (`xcopy` outputs the copied file plus the summary
        rem     `1 File(s)`; to avoid that summary after each file,
        rem     the entire output of `xcopy` is surpressed): */
        > nul xcopy /L /Y /C /H /K %EXCLUSIONS% "%%~F" "%TARGET%"
        rem /* (after testing, remove `/L` to do actual copying) */
    ) && (
        rem /* Return every copied file to see what has been copied;
        rem    `&&` lets `echo` execute inly if `xcopy` succeeded: */
        echo(%%~F
    )
)

rem // Delete temporary exclusions file:
del "%EXCLFILE%"

endlocal
exit /B

您无需为xcopy创建排除文件(与类似的previous question一样),因为该文件是由脚本自动创建的。您只需要在Define constants here:备注的部分中定义所有文件和目录位置,文件模式和排除项。

在测试输出是否列出您要复制的所有文件之后,您需要从/L命令中删除xcopy开关才能实际复制和文件

答案 1 :(得分:0)

我会使用最后一个命令进行微小改动:

pandas

这将遍历FOR /F "delims=" %%f IN ('dir /s/b *.jpg,*.png') DO ( XCOPY /H /S "%%~f" "%destination%") 列出的所有文件,还有隐藏/系统文件等的其他属性。

然后它只是将所有内容复制到平面目标文件夹中。注意:目标文件夹必须以dir /s/b *.jpg,*.png

结尾

-----编辑 - 重复另一个分区------

\