2013-01-11 22 views
1

這看起來應該很簡單,但我被卡住了。我正在從文本文件中遍歷照片文件路徑列表並刪除每個文件路徑。問題是,如果del命令失敗(這可能發生在文件不存在或被某些其他程序使用的情況下),我在日誌中沒有收到任何通知。循環期間bat文件捕獲錯誤:重定向似乎沒有工作

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 

但是,我只是得到了命令本身的回聲。請幫忙!

* UPDATE * 想通了: 好老的試錯:不得不搬到日誌輸出,bat文件執行之外的重定向。

像這樣:

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

該訣竅。

+0

對不起,我只是不明白。您發佈的腳本*不會執行DEL命令,而是執行它們。所以,自然,你不可能*得到任何「文件未找到」錯誤。 –

+0

是 - 它回顯刪除命令,而不是刪除命令的結果。如果你看看我上面的日誌示例,你會看到即使刪除命令失敗,它仍然只是迴應原始命令。我需要它來回應錯誤。訣竅是將日誌記錄添加到bat文件請求中,而不是在bat文件本身中。現在它工作完美。 –

+0

也許你忘了添加一些東西,因爲從我所看到的情況來看,DEL命令不會在腳本中失敗,因爲*腳本中沒有DEL命令*。有一個ECHO打印字符串,它看起來像DEL命令,但它們從不被執行,所以不可能談論失敗的東西。我的意思是,你已經設法解決這個問題並且我非常高興你真的很高興。我只是指出,你的問題中可能沒有足夠的信息讓其他人找出問題。 –

回答

1

在回答評論時,這裏是我嘗試刪除文本文件中列出的文件並記錄結果的腳本。如果文件被成功刪除,它記錄filename deleted,否則它會記錄由DEL命令產生的錯誤信息:

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

我必須承認,我不得不使用小技巧,使我的劇本或多或少緊湊。我最初的想法是基於檢查DEL執行的直接結果(退出代碼)。但是,它似乎並沒有根據目標文件的存在來設置退出代碼。更具體地說,無論文件是否被找到,它都返回「成功」。是的,如果無法找到文件,它會打印出錯信息,但無論如何退出碼都是0。

所以我被迫減少自己的技巧和策略,最終找到了this page,從這裏我的小動作來了。這個想法基本上是檢查DEL的stderr輸出是否包含任何東西。如果沒有,請考慮實際成功並打印filename deleted。否則,發現的消息最終會進入日誌文件。

您可以看到輸出的重定向放置在腳本中。如果您希望在調用批處理腳本時在命令行上指定重定向,請刪除logfile (行和相應的右括號。

+0

感謝您的額外信息。現在是凌晨3點半,所以我要去睡覺了。但我一定會在明天查看更詳細的信息。再次感謝! –