我想要一个脚本,以便我的文件从一个文件夹移动到另一个文件夹并创建一个新文件(如果任何文件已存在)。
例如,我在下载文件夹中有一个文件 test.csv。当我运行以下脚本时,如果 downloads1 文件夹中存在任何同名文件,则覆盖该文件。
但是我想要,它不应该覆盖现有文件,但两个文件都应该在那里..可能会更改名称。在后面添加 1,2 。
move C:\user\Downloads\*.csv C:\user\downloads1\
我也知道使用 /-Y 会问我是否需要覆盖。但我想自动执行此操作。
move /-Y C:\user\Downloads\*.csv C:\user\downloads1\
最简单的方法:
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
未测试。
您可以先移动不存在的文件,然后重命名源目录中剩余的文件,然后复制到目标。
@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
不确定这是否仅适用于某些版本的 Windows,但适用于 Windows 10 Pro 21H1,
C:\>移动/? 移动文件并重命名文件和目录。 ... /-Y 导致提示确认您要覆盖 现有的目标文件。 开关 /Y 可能存在于 COPYCMD 环境变量中。 这可以在命令行上用 /-Y 覆盖。默认为 提示覆盖 除非正在执行 MOVE 命令 在批处理脚本中。
注意重点:
默认为覆盖时提示 除非从批处理脚本中执行 MOVE 命令。
因此,如果您从批处理脚本执行
move
,您不应该遇到提示问题(即不需要 echo No|
)。