写个批处理做文件备份,跑到一半弹出一句「是否覆盖 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,支持镜像同步、多线程和断点恢复,日志也更清晰。
最后提醒一句:强制覆盖意味着目标位置的数据会被直接替换,脚本测试时先拿不重要的目录跑一遍,确认路径没写反再上生产。