BAT文件中COPY命令STDERR重定向无预期结果问题求助
解决Copy命令错误日志为空的问题
我一眼就看出问题所在了——在Windows CMD环境下,copy命令的错误提示信息并不是输出到STDERR(2),而是输出到STDOUT(1)!这就是你用2>>CopyError.log重定向根本抓不到错误的原因,因为错误消息根本没走这个通道。
先验证这个结论
你可以试试在控制台直接执行:
copy NoFile02.txt NewFile02.txt > test.log
打开test.log你会发现,那句“系统找不到指定路径”的错误信息就在里面,这就证明错误是从STDOUT输出的。
解决方法
方法1:重定向STDOUT来捕获错误(同时会记录成功的Copy信息)
如果你能接受把成功提示和错误都记录到同一个日志,直接把1>>加到命令里:
Copy /Y FileExist01.txt NewFile01.txt 1>>CopyLog.log 2>&1 Copy /Y NoFile02.txt NewFile02.txt 1>>CopyLog.log 2>&1 Copy /Y FileExist03.txt NewFile03.txt 1>>CopyLog.log 2>&1 Copy /Y NoFile04.txt NewFile04.txt 1>>CopyLog.log 2>&1
这里2>&1是把STDERR也重定向到STDOUT的目标,确保所有输出都进日志。
方法2:只记录错误,过滤掉成功提示
如果只想记录错误,可以结合findstr来过滤掉成功的“已复制 1 个文件”信息:
Copy /Y FileExist01.txt NewFile01.txt 2>&1 | findstr /V /C:"已复制 1 个文件" >> CopyError.log Copy /Y NoFile02.txt NewFile02.txt 2>&1 | findstr /V /C:"已复制 1 个文件" >> CopyError.log Copy /Y FileExist03.txt NewFile03.txt 2>&1 | findstr /V /C:"已复制 1 个文件" >> CopyError.log Copy /Y NoFile04.txt NewFile04.txt 2>&1 | findstr /V /C:"已复制 1 个文件" >> CopyError.log
/V参数是反向匹配,排除包含指定字符串的行,这样只有错误信息会被写入日志。
方法3:换用Robocopy(推荐,更规范的文件复制工具)
Robocopy是Windows自带的更强大的复制工具,它的错误信息会正确输出到STDERR,完全符合你的预期用法:
Robocopy . FileExist01.txt NewFile01.txt /NJH /NJS 2>>CopyError.log Robocopy . NoFile02.txt NewFile02.txt /NJH /NJS 2>>CopyError.log Robocopy . FileExist03.txt NewFile03.txt /NJH /NJS 2>>CopyError.log Robocopy . NoFile04.txt NewFile04.txt /NJH /NJS 2>>CopyError.log
/NJH和/NJS是用来关闭作业头和摘要信息的,避免日志里出现多余内容,只保留错误提示。
内容的提问来源于stack exchange,提问作者Hung Bui
相关产品推荐
相关产品推荐

