批量脚本移动文件而不覆盖

问题描述 投票:0回答:3

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

例如,我在下载文件夹中有一个文件 test.csv。当我运行以下脚本时,如果 downloads1 文件夹中存在任何同名文件,则覆盖该文件。

但是我想要,它不应该覆盖现有文件,但两个文件都应该在那里..可能会更改名称。在后面添加 1,2 。

move C:\user\Downloads\*.csv C:\user\downloads1\

我也知道使用 /-Y 会问我是否需要覆盖。但我想自动执行此操作。

move /-Y C:\user\Downloads\*.csv C:\user\downloads1\
batch-file cmd
3个回答
5
投票

最简单的方法:

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

未测试。


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

0
投票

不确定这是否仅适用于某些版本的 Windows,但适用于 Windows 10 Pro 21H1,

C:\>移动/?
移动文件并重命名文件和目录。

...

  /-Y 导致提示确认您要覆盖
                          现有的目标文件。

开关 /Y 可能存在于 COPYCMD 环境变量中。
这可以在命令行上用 /-Y 覆盖。默认为
提示覆盖 除非正在执行 MOVE 命令
在批处理脚本中。

注意重点:

默认为覆盖时提示 除非从批处理脚本中执行 MOVE 命令。

因此,如果您从批处理脚本执行

move
,您不应该遇到提示问题(即不需要
echo No|
)。

© www.soinside.com 2019 - 2024. All rights reserved.