在xcopy中排除多个文件扩展名

时间:2020-12-04 23:58:19

I have few extensions which I want to exclude from xcopy. I don't know in which folder/directory those may exist.

我有几个扩展,我想从xcopy中排除。我不知道哪些文件夹/目录可能存在。

Below is the command I'm using:

以下是我正在使用的命令:

xcopy /r /d /i /s /y C:\test1 C:\test2 /exclude:.txt+.exe

Anh help on this?

Anh对此有所帮助?

1 个解决方案

#1


4  

What you are looking for is this:

你在寻找的是:

xcopy /R /D /I /S /Y /EXCLUDE:exclude.txt "C:\test1" "C:\test2"

Together with the following content of exclude.txt:

连同以下exclude.txt的内容:

.txt
.exe

However, the /EXCLUDE option of xcopy is very poor. It does not really exclude files with the given extensions, it actually excludes all items whose full paths contain .txt or .exe at any position. Supposing there is a source file C:\test1\my.txt.files\file.ext, it is going to be excluded also.

但是,xcopy的/ EXCLUDE选项非常差。它并不真正排除具有给定扩展名的文件,它实际上排除了其完整路径在任何位置包含.txt或.exe的所有项目。假设有一个源文件C:\ test1 \ my.txt.files \ file.ext,它也将被排除。


There are several methods to overcome this, some of which I want to show you:

有几种方法可以解决这个问题,其中一些我想告诉你:

  1. Use the robocopy command and its /XF option:

    使用robocopy命令及其/ XF选项:

    robocopy "C:\test1" "C:\test2" /S /XO /XF "*.txt" "*.exe"
    
  2. Create a , using a for /F loop, together with xcopy /L, to pre-filter the files:

    使用for / F循环和xcopy / L创建批处理文件,以预过滤文件:

    set /A "COUNT=0"
    for /F "delims=" %%F in ('
        rem/ // List files that would be copied without `/L`; remove summary line: ^& ^
            xcopy /L /R /D /I /S /Y "C:\test1" "C:\test2" ^| find ".\"
    ') do (
        rem // Check file extension of each file:
        if /I not "%%~xF"==".txt" if /I not "%~xF"==".exe" (
            rem // Create destination directory, hide potential error messages:
            2> nul mkdir "C:\test2\%%~F\.."
            rem // Actually copy file, hide summary line:
            > nul copy /Y "C:\test1\%%~F" "C:\test2\%%~F" && (
                rem // Return currently copied file:
                set /A "COUNT+=1" & echo(%%~F
            ) || (
                rem // Return message in case an error occurred:
                >&2 echo ERROR: could not copy "%%~F"!
            )
        )
    )
    echo         %COUNT% file^(s^) copied.
    

#1


4  

What you are looking for is this:

你在寻找的是:

xcopy /R /D /I /S /Y /EXCLUDE:exclude.txt "C:\test1" "C:\test2"

Together with the following content of exclude.txt:

连同以下exclude.txt的内容:

.txt
.exe

However, the /EXCLUDE option of xcopy is very poor. It does not really exclude files with the given extensions, it actually excludes all items whose full paths contain .txt or .exe at any position. Supposing there is a source file C:\test1\my.txt.files\file.ext, it is going to be excluded also.

但是,xcopy的/ EXCLUDE选项非常差。它并不真正排除具有给定扩展名的文件,它实际上排除了其完整路径在任何位置包含.txt或.exe的所有项目。假设有一个源文件C:\ test1 \ my.txt.files \ file.ext,它也将被排除。


There are several methods to overcome this, some of which I want to show you:

有几种方法可以解决这个问题,其中一些我想告诉你:

  1. Use the robocopy command and its /XF option:

    使用robocopy命令及其/ XF选项:

    robocopy "C:\test1" "C:\test2" /S /XO /XF "*.txt" "*.exe"
    
  2. Create a , using a for /F loop, together with xcopy /L, to pre-filter the files:

    使用for / F循环和xcopy / L创建批处理文件,以预过滤文件:

    set /A "COUNT=0"
    for /F "delims=" %%F in ('
        rem/ // List files that would be copied without `/L`; remove summary line: ^& ^
            xcopy /L /R /D /I /S /Y "C:\test1" "C:\test2" ^| find ".\"
    ') do (
        rem // Check file extension of each file:
        if /I not "%%~xF"==".txt" if /I not "%~xF"==".exe" (
            rem // Create destination directory, hide potential error messages:
            2> nul mkdir "C:\test2\%%~F\.."
            rem // Actually copy file, hide summary line:
            > nul copy /Y "C:\test1\%%~F" "C:\test2\%%~F" && (
                rem // Return currently copied file:
                set /A "COUNT+=1" & echo(%%~F
            ) || (
                rem // Return message in case an error occurred:
                >&2 echo ERROR: could not copy "%%~F"!
            )
        )
    )
    echo         %COUNT% file^(s^) copied.