为什么我的批处理文件会在当前文件夹中创建一个额外的副本?

Why does my batch file create an additional copy in current folder?

我有一个文件夹 xyz。它有一个批处理文件,可以将文件从源目录 abc 复制到目标目录 def。我正在使用 copy 和选项 /v /y

复制绝对没问题。但我注意到一个奇怪或怪异的问题,即文件夹 xyz 中还存在从源复制到目标的所有文件的副本。

我在系统重启后开始观察到这个问题,不确定它是否是一次性问题。但我想知道以前是否有人 运行 遇到过这个问题,可能的解决方法是什么?

代码如下:

@if not defined ECHO_ON echo off
SETLOCAL EnableDelayedExpansion
set arg1=%1
set arg2=%2
copy /v /y !arg1! !arg2!
call :getPath !arg1!
ren !arg2!\!_NAME_EXT! !_NAME!.svg

:getPath
set _NAME=%~n1
set _NAME_EXT=%~nx1
set _LOC=%~dp1
goto:eof
endlocal

请注意,我在同一个 .bat 文件中使用 copyrobocopy 命令(用于其他一些复制操作)。

这有什么好担心的吗?

(正如我所写的那样,在重新启动之前一切正常。)

你的双重 Copy 是因为批处理脚本逐行工作,直到它到达文件结束标记或退出指令。 Call 命令 returns 回到 Call 指令之后的点。当它 returns 时,直到你的脚本底部没有退出指令或文件结束标记,所以再次执行 :getPath 标签。

似乎完全没有理由在您的脚本中使用 EnableDelayedExpansionSet 设置任何变量或使用 Call 命令。因此,我将其简化为:

@Echo Off
If "%~2"=="" Exit /B
If Not Exist "%~2\" MD "%~2" 2>Nul || Exit /B
If Exist "%~1" Copy /V /Y "%~1" "%~2\%~n1.svg"

希望对你有所帮助