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

batch file to copy only one of filetype for each subfolder to another folder

这是我的代码:

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

它的作用是从data文件夹下的子文件夹中复制所有.mtl文件类型的文件,并复制到桌面的mtl文件夹中,同时保留其文件夹结构。

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

我该怎么做?

@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 的设置以适合您的情况。

第一步是使用xcopy/t选项创建目标子树。

已将 source 设置为虚拟值,使用子例程 chksubdir 处理文件的每一行 XCOPY /L /S。这是一个 list-only,实际上并没有进行复制。

子例程检查提供的参数是否包含 \,因为 xcopy /L 的最后一行是 count-report。如果没有找到\,则退出。

否则,将source匹配到所选文件的驱动器+路径。如果这些是not-equal,那么就已经找到一个新的目录,否则跳过这个文件。

source 设置为新的子目录名称,然后将 sub 设置为该全名减去相对根目录,从而在相对根目录下给出子目录字符串。

将它们串起来生成一个简单的 copy 命令。