使用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.txtfile2.txtfile8.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.