使用 CMD 或批处理将多个文件从子文件夹移动到一个文件夹

使用 CMD 或批处理将多个文件从子文件夹移动到一个文件夹

我的子文件夹中有文件,其文件夹结构如下:

D:\Folder_Source  
D:\Folder_Source\file1.txt  
D:\Folder_Source\FolderA  
D:\Folder_Source\FolderA\file1.txt  
D:\Folder_Source\FolderA\file2.txt  
D:\Folder_Source\FolderB  
D:\Folder_Source\FolderB\file3.txt  
D:\Folder_Source\FolderB\file4.txt  
D:\Folder_Source\FolderB\file8.txt

我想将txt每个子文件夹中的一些文件移动到C:\Destination\从命令提示符。

例如我要移动的文件有,,,file1.txt等等。file2.txtfile8.txt

如果目标文件夹中有一个文件与正在复制的源文件夹中的文件同名,我想要保留两个文件并且不覆盖现有文件

我尝试了这个但失败了并且没有给我预期的结果:

move /s file1.txt file2.txt file8.txt C:\Destination

通过命令行或者批处理脚本可以实现这样的事情吗?

答案1

您可以使用批处理脚本并在其中设置三个变量,其中一个是根源目录的路径将遍历特定文件,第二个是目标路径新文件将被复制到哪里,第三个是您要复制的文件名的文件列表到目标目录。

利用这三个变量,您可以使用FOR /R循环遍历源位置并使用条件IF逻辑来检查文件是否已经存在,以便对每个文件执行任何复制或删除操作。此外,您还可以使用CALL变量替换将文件名的各个部分传递给另一个例程并使用附加IF逻辑以及SET /A增加重复文件的数量等等。


批处理脚本

@ECHO OFF

SET "source=C:\Folder_Source"
SET "dest=C:\Destination"
SET "FileList=file1.txt file2.txt file8.txt" 

SET "dupCnt=1"

FOR /R "%source%" %%A IN (%FileList%) DO (
    IF NOT EXIST "%dest%\%%~NXA" (
        XCOPY /F /Y "%%~FA" "%dest%\" && IF EXIST "%%~FA" DEL /Q /F "%%~FA"
    ) ELSE (
        CALL :DupeRoutine "%%~FA" "%%~NA" "%%~XA"
        )
    )
GOTO :EOF

:DupeRoutine
IF EXIST "%dest%\%~2_(%dupCnt%)%~3" (
    SET /A dupCnt=%dupCnt%+1
    CALL :DupeRoutine "%~1" "%~2" "%~3"
) ELSE (
    IF NOT EXIST "%dest%\%~2_(%dupCnt%)%~3" ECHO F | XCOPY /Y /F "%~1" "%dest%\%~2_(%dupCnt%)%~3" && DEL /Q /F "%~1"
    SET "dupCnt=1" 
    )
GOTO :EOF

结果

笔记:如果您希望重复文件名使用_(#)我使用的命名约定以外的其他命名约定,则需要将_(%dupCnt%)脚本中的 更改"%dest%\%~2_(%dupCnt%)%~3"为您希望使用的任何其他格式,但%dupCnt%数字会增加。我也很乐意进一步提供帮助。

来源之前

D:\Folder_Source
│   file1.txt
│   file2.txt
│   file4.txt
│   file8.txt
│   file99.txt
├───FolderA
│       file1.txt
│       file2.txt
│       file4.txt
│       file8.txt
│       file99.txt
└───FolderB
        file1.txt
        file2.txt
        file4.txt
        file8.txt
        file99.txt

目的地之后

C:\Destination
    file1.txt
    file1_(1).txt
    file1_(2).txt
    file2.txt
    file2_(1).txt
    file2_(2).txt
    file8.txt
    file8_(1).txt
    file8_(2).txt

来源之后

D:\Folder_Source
│   file4.txt
│   file99.txt
├───FolderA
│       file4.txt
│       file99.txt
└───FolderB
        file4.txt
        file99.txt

更多资源

  • 支持/R
  • 如果
  • 复制
  • 德尔
  • 称呼

  • 批量替换 (FOR /?)

    此外,FOR 变量引用的替换功能也得到了增强。现在您可以使用以下可选语法:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    
  • 算术表达式 (SET /a)

    对于简单的算术来说,将表达式放在“引号”中是可选的,但对于使用逻辑运算符的任何表达式来说,这都是必需的。

    任何SET /A返回小数结果的计算都将向下舍入为最接近的整数。

    待求值的表达式可以包含以下运算符:

    + Add set /a "_num=_num+5"

相关内容