首页 > 解决方案 > 使用批处理脚本在文本文件中使用文件夹列表将只需要的文件夹复制到目标文件夹

问题描述

我只想将特定文件夹及其中的文件从源位置复制到目标位置。文件夹列表在单独的文本文件中给出。

文本文件具有类似的值

01
02
03

例如源文件夹父文件夹和子文件夹

a --> 

   01 --> Hi.txt
b --> 
   c -- > 
        d --> 
              02  --> foo.txt, abc.xlsx
e --> 
     02 --> foo.txt
f -->
     03 --> cde.txt
g -->
     04 --> xyz.txt

目标文件夹所需的输出

01 --> Hi.txt
02 --> foo.txt, abc.xlsx
02[2] --> foo.txt
03 --> cde.txt

我当前的代码无法在目标文件夹中创建带有后缀 [2] 的重复文件夹,而是要求 [覆盖目标文件夹中已经存在的文件]:

例如,上面示例中的文件夹 02 在两个不同的子文件夹中出现两次。使用下面的代码,它只在目标中创建一个 02 文件夹,从其中的第一个 02 源文件夹中复制文件,并在下一次出现时,它只是说目标中已经存在文件夹你想覆盖名称与文件相似的文件已经在目标 02 文件夹中。

有人可以帮我解决这个问题并帮我创建后缀为 [2] 、 [3] .. 的重复文件夹,以此类推,以解决任意数量的重复文件夹名称。

代码:

 @echo off

    set SRC_FOLDER="C:\Source\"
    set DST_FOLDER="C:\Destination"

    for /f "tokens=*" %%a in 
 (C:\Users\Desktop\CopyScript\TextFile.txt) 
    do (
    for /d /r %SRC_FOLDER% %%G in (*) do (
        set /x counter=0
        REM echo %%~nxG and %%G and %%a
        if "%%~nxG"=="%%a" (

            :loop
            if exist %DST_FOLDER%\%%a[%x%] set /x 
      counter=!counter!+1 && goto :loop
                mkdir %DST_FOLDER%\%%a[%x%]
                xcopy "%%G" %DST_FOLDER%\%%a[%x%]
            )       
     )
     )

标签: windowsshellbatch-filecommand-line

解决方案


@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "filename1=%sourcedir%\q57193198.txt"
FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO (
 FOR /f "delims=" %%e IN ('dir /s /b /ad "%sourcedir%\*"') DO IF /i "%%~nxe"=="%%a" (
  SET "copied="
  IF NOT EXIST "%destdir%\%%a" XCOPY "%%e\*" "%destdir%\%%a\"&SET "copied=y"
  IF NOT DEFINED copied FOR /L %%s IN (1,1,999) DO IF NOT DEFINED copied IF NOT EXIST "%destdir%\%%a[%%s]" XCOPY "%%e\*" "%destdir%\%%a[%%s]\"&SET "copied=y"
 )
)
GOTO :EOF

您将需要更改设置sourcedirdestdir适应您的情况。该清单使用适合我的系统的设置。

我使用了一个名为q57193198.txt包含一些虚拟数据的文件进行测试。

从文件中读取每一行,%%a然后使用 adir /s/b%%e. 将叶子%%~nxe名称与文件中的名称匹配。在匹配时,将标志设置为空copied然后如果目标%%a目录丢失,使用xcopy创建它,复制文件,然后设置copiedsomething

如果第一次尝试失败(即%%a目录存在),那么copied将是未定义的,因此检测其中%%a[1..999]第一个存在的存在,xcopy使用修改后的目标目录进行操作,并设置copied标志。一旦copied设置了标志,if not exist ..%%a[?]就会关闭。


推荐阅读