CMD递归遍历目录复制.accdr改后缀为.accdb命令报错如何解决
原命令的错误原因
- 你写的
FOR /R虽然递归枚举了根目录下的所有子文件夹,但循环体执行时,当前工作目录始终是你启动命令时所在的目录,并没有自动切换到遍历到的子文件夹,所以循环里的copy *.accdr *.accdb一直是在初始目录下查找.accdr文件,自然找不到对应文件报错。 - 循环中定义的
%F变量完全没有被使用,遍历到的目录路径根本没有传入到复制操作中。
修正方案
以下命令可以直接在CMD窗口中执行,两种方案都能满足需求:
方案1:遍历目录时切换工作路径
逻辑和你手动进入单个文件夹执行命令完全一致,通过pushd临时切换到遍历到的目录,执行完复制操作再切回原路径:
FOR /R "c:\directory\" %F IN (.) DO ( pushd "%F" copy /Y *.accdr *.accdb popd )
命令里的/Y参数用于自动确认覆盖同名文件,不需要可以去掉。注意这个方案遇到没有.accdr文件的子目录时,还是会空跑copy命令弹出“找不到文件”的提示。
方案2:直接递归匹配目标文件(更推荐)
不需要切换目录,直接让for命令递归枚举所有.accdr后缀的文件,逐个生成同目录下的.accdb副本,不会产生无意义的报错,执行效率更高:
FOR /R "c:\directory\" %F IN (*.accdr) DO ( copy /Y "%F" "%~dpnF.accdb" )
其中%~dpnF是CMD循环变量的固定语法,代表取%F对应文件的盘符、所在目录路径、不带后缀的文件名,拼接.accdb后缀后就是和原文件同目录的同名目标文件。
注意:如果你要把命令写入
.bat/.cmd批处理脚本文件使用,需要把命令里所有的%F替换为%%F,否则批处理无法正确识别循环变量。
内容的提问来源于stack exchange,提问作者rasm
相关产品推荐
相关产品推荐

