循环期间捕获bat文件中的错误:重定向似乎不起作用

时间:2013-01-11 06:13:43

标签: batch-file cmd

这看起来应该很简单,但我被卡住了。我正在循环文本文件中的照片文件路径列表并删除每个文件路径。问题是如果del命令失败(如果文件不存在或某些其他程序正在使用,可能会发生这种情况),我在日志中没有收到任何通知。

BTW-这是Windows Server 2008 R1 CMD。

这是我的代码:

@echo off
for /F %%A in (f:\deletePhotos\deletelist.txt) do (
    echo del %%A /f >> f:\deletePhotos\log.txt 2>&1
)

以下是日志示例:

del f:\photos\11\48\ALX10-9322-48.jpg /f
del f:\photos\11\48\ALX10-9692-48.jpg /f
del f:\photos\11\48\LKSR20-5910-48.jpg /f
del f:\photos\11\48\LKSR20-8639-48.jpg /f
del f:\photos\11\48\SEMN4030836-48.jpg /f
del f:\photos\11\48\SEMN4036515-48.jpg /f

日志中的文件(上面)不存在(我查看过)。显然,我试图让日志显示一些错误,如:

Could Not Find f:\photos\11\48\ALX10-9322-48.jpg

但我只是得到命令本身的回声。请帮忙!

*的 更新 * 弄清楚了: 好旧的试验和错误:必须移动日志输出和重定向以外的bat文件执行。

像这样:

f:\deletephotos>del.bat f:\deletePhotos\delete_11.txt >> f:\deletePhotos\log.txt 2>&1

这就是诀窍。

1 个答案:

答案 0 :(得分:1)

在回答评论时,这是我尝试删除文本文件中列出的文件并记录结果的脚本。如果成功删除文件,则会记录filename deleted,否则会记录DEL命令生成的错误消息:

@ECHO OFF
> logfile (
  FOR /F "tokens=*" %%A IN (filelist) DO (
    DEL "%%A" 2>&1 | FINDSTR "." || (ECHO %%A deleted)
  )
)

我必须承认,我必须使用一个小技巧来使我的脚本或多或少紧凑。我最初的想法是基于检查DEL执行的直接结果(退出代码)。但是,看来DEL不会根据目标文件的存在来设置退出代码。更具体地说,无论是否找到文件,它都会返回“成功”。是的,如果找不到文件,它会打印错误信息,但在任何一种情况下退出代码都是0。

所以我被迫减少自己的伎俩和策略,最终找到this page,从那里我的小技巧来了。基本上,这个想法是检查DEL的stderr输出是否包含任何。如果没有,请考虑实际成功并打印filename deleted。否则,发现的消息最终会进入日志文件。

您可以看到输出的重定向位于脚本中。如果您希望在调用批处理脚本时在命令行上指定重定向,请删除logfile (行和相应的右括号。