如何防止自动覆盖文件,或如何添加(1)和(2)来复制文件而不是覆盖

时间:2018-03-14 14:16:46

标签: batch-file overwrite

我创建了一个将在FTP服务器上运行的批处理文件。有一个相机可以在C:\ images \ 0000中以xxxxNG.txt和xxxxOK.txt格式保存文件。我写的脚本用当前时间和日期重命名文件,并根据原始文件名将它们移动到其他地方的OK或NG文件夹。

这很有效,但是如果有多个图像一次处理,程序会将它们全部命名并覆盖直到不再存在,只留下最后一个。

这是我到目前为止所拥有的:

rem This is a simple script to move images from the FTP save location to the 
backup location (here)

echo off
cls
:again
@echo off
cls

for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
set "YY=%dt:~2,2%" & set "YYYY=%dt:~0,4%" & set "MM=%dt:~4,2%" & set "DD=%dt:~6,2%"
set "HH=%dt:~8,2%" & set "Min=%dt:~10,2%" & set "Sec=%dt:~12,2%"
set "dateandtime=%YYYY%-%MM%-%DD%_%HH%-%Min%-%Sec%"

echo The current time is: %dateandtime%
echo.
echo Moving new files...

rem if exist %dateandtime%*.txt (


for /r "C:\test\Images" %%x in (*OK.txt) do move "%%x" C:\test\OK\" "%dateandtime%_OK.txt"

for /r "C:\test\Images" %%x in (*NG.txt) do move "%%x" C:\test\NG\" "%dateandtime%_NG.txt"

echo New files have been renamed and moved.
echo.
echo Checking for old files...

forfiles -p "C:\test\OK" -s -m *.* -d -1 -c "cmd /c del /Q @path"
forfiles -p "C:\test\NG" -s -m *.* -d -1 -c "cmd /c del /Q @path"

echo Files older than 5 years have been deleted.
echo.

timeout /t 1 /nobreak 

goto again

echo done

如何命名同时处理的文件以不覆盖并具有不同的名称?我试过一个方法来检查文件是否已经存在,但是我不知道如何修改for / r“C:\ test \ Images”%% x in(* OK.txt)do move“%% x”C :\ test \ OK \“”%dateandtime%_OK.txt“行来容纳这个。我正在尝试像

for /r "C:\test\Images" %%x in (*OK.txt) do move "%%x" C:\test\OK\" "%dateandtime%-%foo%_OK.txt"

但%foo%打破了它。我以为我理解foo是for循环的迭代。在do循环中是否存在等价物?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

恕我直言,解决当前问题的最简单方法是使用原始文件名并将时间戳附加到原始文件名。

for /r "C:\test\Images" %%G in (*OK.txt) do move "%%G" "C:\test\OK\%%~nG-%dateandtime%%%~xG"

我为FOR元变量使用大写字母,这样就不会对使用的命令修饰符造成任何混淆。

因此,如果您的输入文件名是:

1234OK.txt
7890OK.txt

它们将被移动并重命名为:

1234OK-20180314104211.txt
7890OK-20180314104211.txt