批处理文件循环文件夹和复制文件夹&具有相同文件夹名称的目录的内容

时间:2014-12-14 17:06:52

标签: batch-file

每个月,公司将不同数量的文件转储(保存)到共享网络驱动器上的不同数量的文件夹中。这些文件包含.xlsx或.pdf文件格式的信息,文件夹代表不同的项目。文件夹名称仅包含项目编号(即12345,15241-0001,16755-0004等)。通常是五位数字或五位数字,后跟连字符,然后是四位数字。

我希望能够创建一个批处理文件,可以运行以循环通过公司转储到共享网络共享驱动器的文件夹,然后将项目文件夹和内容(文件)复制到另一个共享网络驱动器包含我部门中的操作使用的相应项目文件夹。操作共享网络驱动器上的项目文件夹名称包含项目编号,空格,连字符,另一个空格,然后是项目名称(即12345 - 项目1,15241-0001 - 项目22,16755-0004 - 项目12,等...)

...更新 Magoo你一直在寻找帮助,因为我正在从你的帖子中学习。我没有考虑到操作方面的子项目都在主项目文件夹中:

u:\destdir\2015\15241\15241-0001 - Project 06 u:\destdir\2015\15241\15241-0001 - Projekt 60 u:\destdir\2016\16755\16755-0004 - Project 14

因此脚本不会将文件复制到子项目,因为脚本认为目标不会延伸。是否可以获取项目的前五个字符并插入xcopy命令的目标目录?

1 个答案:

答案 0 :(得分:1)

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
SET "destdir=U:\destdir"
FOR /f "delims=" %%a IN (
 'dir /b /ad "%sourcedir%\*" '
 ) DO (
 FOR /f "delims=" %%b IN (
  'dir /b /ad "%destdir%\%%a*" '
  ) DO (
  ECHO(XCOPY /s "%sourcedir%\%%a\*" "%destdir%\%%b\"
)
)

GOTO :EOF

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

所需的XCOPY命令仅用于ECHO用于测试目的。 在您确认命令正确后,将ECHO(XCOPY更改为XCOPY以实际复制文件。


编辑:根据更多半信息进行修订。

假设目的地结构为...\2012\12???(-?????) - waffle,那么

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
SET "destdir=U:\destdir"
FOR /f "delims=" %%a IN (
 'dir /b /ad "%sourcedir%\*" '
 ) DO CALL :process "%%a"

GOTO :EOF

:process
SET "year=%~1"
SET /a year=20%year:~0,2%
SET "copied="
FOR /f "delims=" %%b IN (
 'dir /b /ad "%destdir%\%year%\%~1*" 2^>nul'
 ) DO IF DEFINED copied (ECHO %1 NOT copied to duplicate destination "%destdir%\%year%\%%b\"
 ) ELSE (
  SET "copied=%destdir%\%%b\"
  ECHO(                    XCOPY /s "%sourcedir%\%~1\*" "%destdir%\%year%\%%b\"
 )
)
IF DEFINED copied (ECHO %1 WAS copied to destination "%copied%"
) else (ECHO %1 WAS NOT copied - no destination found)
GOTO :EOF

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

测试结果:

目标目录结构

u:\destdir\2012
u:\destdir\2015
u:\destdir\2016
u:\destdir\2012\12345 - Project 98
u:\destdir\2015\15241-0001 - Project 06
u:\destdir\2015\15241-0001 - Projekt 60
u:\destdir\2016\16755-0004 - Project 14

流程输出:

                    XCOPY /s "U:\sourcedir\t w o\12345\*" "U:\destdir\2012\12345 - Project 98\"
"12345" WAS copied to destination "U:\destdir\12345 - Project 98\"
                    XCOPY /s "U:\sourcedir\t w o\15241-0001\*" "U:\destdir\2015\15241-0001 - Project 06\"
"15241-0001" NOT copied to duplicate destination "U:\destdir\2015\15241-0001 - Projekt 60\"
"15241-0001" WAS copied to destination "U:\destdir\15241-0001 - Project 06\"
                    XCOPY /s "U:\sourcedir\t w o\16755-0004\*" "U:\destdir\2016\16755-0004 - Project 14\"
"16755-0004" WAS copied to destination "U:\destdir\16755-0004 - Project 14\"
"13234-1234" WAS NOT copied - no destination found

请注意,xcopy行缩进以便于分离。

连字符为我工作!


对proess排除列表的修订 - 假设排除列表将短于包含列表(2行更改 - 添加排除列表set并处理该列表。

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
SET "destdir=U:\destdir"
SET "excluding=16755-0004"
FOR /f "delims=" %%a IN (
 'dir /b /ad "%sourcedir%\*" '
 ) DO CALL :process "%%a"

GOTO :EOF

:process
FOR %%x IN (%excluding% dummy) DO IF "%~1"=="%%x" ECHO %1 WAS NOT copied - excluded&GOTO :EOF 
SET "year=%~1"
SET /a year=20%year:~0,2%
SET "copied="
FOR /f "delims=" %%b IN (
 'dir /b /ad "%destdir%\%year%\%~1*" 2^>nul'
 ) DO IF DEFINED copied (ECHO %1 NOT copied to duplicate destination "%destdir%\%year%\%%b\"
 ) ELSE (
  SET "copied=%destdir%\%%b\"
  ECHO(                    XCOPY /s "%sourcedir%\%~1\*" "%destdir%\%year%\%%b\"
 )
)
IF DEFINED copied (ECHO %1 WAS copied to destination "%copied%"
) else (ECHO %1 WAS NOT copied - no destination found)
GOTO :EOF

请注意包含dummy以确保for %%x循环中的列表不为空。


对于下一个要求("项目"目录中的级别)还有一行 - 但我赞成excluding行以便于测试。

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir\t w o"
SET "destdir=U:\destdir"
REM SET "excluding=16755-0004"
FOR /f "delims=" %%a IN (
 'dir /b /ad "%sourcedir%\*" '
 ) DO CALL :process "%%a"

GOTO :EOF

:process
FOR %%x IN (%excluding% dummy) DO IF "%~1"=="%%x" ECHO %1 WAS NOT copied - excluded&GOTO :EOF 
SET "year=%~1"
SET /a year=20%year:~0,2%
FOR /f "tokens=1,2delims=-" %%x IN (%1) DO IF NOT "%%y"=="" SET "year=%year%\%%x"
SET "copied="
FOR /f "delims=" %%b IN (
 'dir /b /ad "%destdir%\%year%\%~1*" 2^>nul'
 ) DO IF DEFINED copied (ECHO %1 NOT copied to duplicate destination "%destdir%\%year%\%%b\"
 ) ELSE (
  SET "copied=%destdir%\%%b\"
  ECHO(                    XCOPY /s "%sourcedir%\%~1\*" "%destdir%\%year%\%%b\"
 )
)
IF DEFINED copied (ECHO %1 WAS copied to destination "%copied%"
) else (ECHO %1 WAS NOT copied - no destination found)
GOTO :EOF

year现在不再仅包含年份,但如果提供的文件名包含子项目,则可能是下一个较低的目录级别(项目)。