我有下一个文件夹结构:
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 )
答案 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