命令行:如何将具有相同名称的文件复制到一个目录中而不进行覆盖

时间:2017-06-06 20:29:35

标签: batch-file command-line cmd command-prompt

我有下一个文件夹结构:

C:\My Test\
C:\My Test\Folder_1\activity[1].json
C:\My Test\Folder_N\...\activity[1].json

我的目标是:

将所有activity*json个文件复制到D:\Output\目录,使其具有以下内容:

D:\Output\activity[%unique_variable%].json
D:\Output\activity[%unique_variable%].json

我的代码:

for /R "C:\My Test\" %%f in (activity*.json) do ( copy %%f D:\Output\activity%random%.json )

2 个答案:

答案 0 :(得分:0)

您可以尝试以下内容:

setlocal enabledelayedexpansion
set "type=.json"
set "source=c:\my test"
set "dest=d:\output"

for /r "%source%" %%e in ("*%type%") do (
  for %%i in ("%dest%\%%~ne*") do (
    set /a count+=1
  )
  set "source=%%e"
  set "dest=%dest%\%%~ne"
  xcopy "!source!" "!dest!!count!%type%*"
  set count=
)

如果要复制的文件已存在于目标文件夹中,则会将一个数值添加到文件名中,并在找到的每个副本时递增。

答案 1 :(得分:0)

setlocal enabledelayedexpansion
for /R "C:\My Test\" %%f in (activity*.json) do (
 call :select
 copy %%f D:\Output\activity!unique!.json
)

...
goto :eof

:select
set /a unique=%random%
if exist "D:\Output\activity!unique!.json" goto Select
goto :eof

您的错误是批处理解析器使用代码块(带括号的代码行)的方式 - 通过将任何%var%替换为当时该变量的值。因此,%random%被随机值替换,但每次迭代都不会重新选择,只有一次在解析时。

粗略的方式是调用delayedexpansion(关于此问题的很多文章 - 使用search)并将%random%替换为!random! - 但是有一个小的可能在任何特定运行中多次选择特定随机值,或者建议的新文件名已存在。

因此,使用子程序选择目标文件名并检查建议的名称在子程序中是否唯一(允许goto s)

缺点是您应该在终止批处理时跳过子例程,因此批处理的其余部分由...表示,goto :eof跳过剩余代码(请参阅{{1}来自文档提示)

另一种方法是分配要移动到变量的文件名并在子例程中移动它。这样做的好处是不需要call /?

delayedexpansion