我想要一个脚本,以便我的文件从一个文件夹移动到另一个文件夹并创建一个新文件,如果任何文件已存在。
例如,我在Downloads文件夹中有一个文件test.csv。当我运行下面的脚本时如果覆盖该文件,如果在downloads1文件夹中存在任何具有相同名称的文件。
但我想,它不应该覆盖现有文件,但两个文件都应该在那里。可能会改变name.adds 1,2。
move C:\user\Downloads\*.csv C:\user\downloads1\
我也知道使用/ -Y会问我需要覆盖。但我想自动这样做。
move /-Y C:\user\Downloads\*.csv C:\user\downloads1\
答案 0 :(得分:3)
最简单的方法:
echo No|move /-Y .\file1 .\file2
您也可以使用通配符:
echo NO|move /-Y "C:\user\Downloads\*.csv" "C:\user\downloads1\"
同样在你的情况下:
for %%f in ("C:\user\Downloads\*.csv") do (
echo No|move /-Y "%%~dpfnxf" "C:\user\downloads1\"
)
编辑:
for %%f in ("C:\user\Downloads\*.csv") do (
if exist "C:\user\downloads1\%%~nxf" (
rem move "C:\user\downloads1\%%~nxf" "C:\user\downloads1\%%~nxf.bkp"
move "C:\user\downloads1\%%~nxf" "C:\user\downloads1\%%~nf-%%N.%%~xf"
)
move /Y "%%~dpfnxf" "C:\user\downloads1\"
)
另请检查:Copy files without overwrite
再一次编辑:
setlocal enableDelayedExpansion
for %%f in ("C:\user\Downloads\*.csv") do (
set "moved="
if exist "C:\user\downloads1\%%~nxf" (
for /l %%N in (1,1,50) do (
if not defined moved if not exist "C:\user\downloads1\%%~nxf.%%N" (
move "C:\user\downloads1\%%~nxf" "C:\user\downloads1\%%~nxf.%%N"
set moved=yes
)
)
)
move /Y "%%~dpfnxf" "C:\user\downloads1\"
)
endlocal
未经测试。
答案 1 :(得分:1)
您可以移动第一个非现有文件,然后重命名源目录中的其余文件,然后复制到目标。
@echo off
setlocal enableextensions enabledelayedexpansion
rem configure directories
set "source=c:\user\Downloads"
set "target=c:\user\Downloads1"
rem move non existing files to target
call :doMove
rem if we still have files
if exist "%source%\*.csv" (
rem generate a timestamp
set timestamp=_%date:/=%_%time::=%
set timestamp=!timestamp:,=!
rem rename the remaining files with timestamp
ren "%source%\*.csv" "*.!timestamp!.csv"
rem and move the remainig files to target
call :doMove
)
endlocal
exit /b
:doMove
robocopy "%source%" "%target%" "*.csv" /fp /njh /njs /ndl /xc /xn /xo /xx /mov
goto :EOF