2

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

例如,我在下载文件夹中有一个文件 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\
4

2 回答 2

4

最简单的方法:

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\"
)

还要检查:复制文件而不覆盖

再编辑一个:

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

未测试。

于 2013-10-31T07:57:59.923 回答
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
于 2013-10-31T09:34:22.973 回答