1

これは単純なはずですが、行き詰まっています。テキスト ファイルから写真ファイル パスのリストをループして、それぞれを削除しています。問題は、del コマンドが失敗した場合 (ファイルが存在しないか、他のプログラムで使用されている場合に発生する可能性があります)、ログに通知が表示されないことです。

ところで-これはWindowsサーバー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

しかし、代わりに、コマンド自体のエコーを受け取るだけです。助けてください!

*更新* 考え出した: 古き良き試行錯誤: ログ出力とリダイレクトをバット ファイル実行の外に移動する必要がありました。

このような:

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 に答える