批处理文件,只将每个子文件夹的一个文件类型复制到另一个文件夹

时间:2017-01-21 08:11:07

标签: windows batch-file xcopy

这是我的代码:

xcopy "C:\Users\Me\Desktop\data\*.mtl" "C:\Users\Me\Desktop\mtl" /s /e

它的作用是从数据文件夹下的子文件夹中复制filetype .mtl的所有文件,并将其复制到桌面上的mtl文件夹,同时保留其文件夹结构。

哪个好,但我的目标是将每个子文件夹的文件选择限制为只有一个文件类型.mtl。因此,不是复制每个子文件夹中的所有.mtl文件,而是复制每个子文件夹的一个.mtl文件。

我该怎么做?

1 个答案:

答案 0 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"

xcopy /T /E "%sourcedir%\*.mtl" "%destdir%\"
SET "source=:"
FOR /f "delims=" %%a IN (
 'xcopy /L /s "%sourcedir%\*.mtl" "%destdir%\" '
 ) DO (
 CALL :chksubdir "%%a"
)

GOTO :EOF

:chksubdir
ECHO "%~1"|FIND "\">NUL
IF ERRORLEVEL 1 GOTO :EOF 
IF /i "%source%"=="%~dp1" GOTO :EOF 
SET "source=%~dp1"
CALL SET "sub=%%source:%sourcedir%=%%"
COPY "%~1" "%destdir%%sub%%~nx1" >NUL 2>nul
GOTO :eof

您需要更改sourcedirdestdir的设置以适合您的具体情况。

第一步是使用/t的{​​{1}}选项创建目标子树。

xcopy设置为虚拟值,使用子例程source处理文件的每一行chksubdir。这是一个仅列表,实际上并不进行复制。

子例程检查提供的参数是否包含XCOPY /L /S,因为\的最后一行是计数报告。如果未找到xcopy /L,请退出。

否则,将\与所选文件的驱动器+路径匹配。如果这些不相等,则找到新目录,否则跳过此文件。

source设置为新的子目录名称,然后将source设置为该全名减去相对根,将子目录字符串设置为相对根目录。

将它们串在一起以生成简单的sub命令。