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


2

我在文件夹结构中的子文件夹中的文件是这样的:

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.txt, file8.txt等

如果目标文件夹中的文件与要复制的源文件夹中的文件名相同,我想要 保留两个文件而不是覆盖现有文件 。

我试过这个失败了,并没有给我预期的结果:

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

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

Answers:


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

更多资源

  • FOR / R.
  • 如果
  • XCOPY
  • DEL
  • 呼叫

  • 批量替换(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"


@LutfiCreativesys我用了一个组合 XCOPY &安培; DEL 而不是 MOVE 因为我也可以在该命令中加入一些验证条件逻辑。另请注意,移动时,文件将保留NTFS ACL属性,而使用时 XCOPY 它从复制文件的位置继承ACL属性。通常,您希望在文件夹级别处理文件安全性,这是我更喜欢的另一个原因 XCOPY 过度 MOVE 虽然我用过 Robocopy 我也经常不保持这样的欺骗。如果我可以进一步调整以满足您的需求,请告诉我。
— Pimp Juice IT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.