我的子文件夹中有文件,其文件夹结构如下:
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
通过命令行或者批处理脚本可以实现这样的事情吗?
答案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"