1

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

顺便说一句-这是 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

那成功了。

4

1 回答 1

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。

所以我被迫减少自己的伎俩和计谋,最终找到了这个页面,我的小伎俩由此而来。这个想法基本上是检查 DEL 的stderr输出是否包含任何东西。如果没有,请考虑实际成功并打印filename deleted。否则,发现的消息最终会进入日志文件。

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

于 2013-01-11T09:21:25.527 回答