批处理脚本移动文件而不覆盖

时间:2013-10-31 06:41:19

标签: batch-file cmd

我想要一个脚本,以便我的文件从一个文件夹移动到另一个文件夹并创建一个新文件,如果任何文件已存在。

例如,我在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\

2 个答案:

答案 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