写个批处理做文件备份,跑到一半弹出一句「是否覆盖 xxx?」,脚本就卡在那里等输入。无人值守的任务最怕这个。xcopy 默认遇到同名文件会询问,要让它闭嘴,得加参数。

两个关键字

xcopy "D:\src\*.*" "E:\backup\" /s /e /y /i
  • /y:覆盖已有文件时不提示,直接覆盖。这是核心参数。
  • /i:目标被当作目录。如果目标目录不存在,不加它会提示「目标 XX 是文件名还是目录名」,照样卡住。
  • /s:复制子目录,空目录不复制。
  • /e:包含空目录,配合 /s 用,结构能完整保留。

/y 为什么有时不生效

很多人加上了 /y 还是被问。原因通常是环境变量 COPYCMD 被设成了询问,或者命令里同时存在 /-y。检查一下:

echo %COPYCMD%

如果输出里有 /-y,把它去掉,或者在命令里显式写 /y 让它优先。另外用 Robocopy 的人注意,robocopy 没有 /y,它本来就默认覆盖。

一些实用参数

  • /d:只复制源比目标新的文件,做增量备份很有用。
  • /h:复制隐藏文件和系统文件,不加以会被跳过。
  • /r:3:失败重试次数,默认无限重试,遇到坏文件会卡死。
  • /w:2:重试前等待秒数,和 /r 配合。
  • /exclude:排除某些文件,比如临时文件。

实际脚本里写完整点大概是:

xcopy "D:\data" "E:\backup\data" /s /e /y /i /d /h /r:2 /w:1

这样就不需要任何人工干预了。

xcopy 和 robocopy 怎么选

xcopy 是老工具,脚本短、参数熟,普通复制够用。但它对长路径(超过 260 字符)支持差,大文件和多线程也没有优势。备份大量数据,建议换 robocopy /MIR,支持镜像同步、多线程和断点恢复,日志也更清晰。

最后提醒一句:强制覆盖意味着目标位置的数据会被直接替换,脚本测试时先拿不重要的目录跑一遍,确认路径没写反再上生产。