18

バッチ ファイルを使用して、14 日以上前にアーカイブされたドキュメントを削除しています。スクリプトのリターン コードを読み取る自動化プロセス (Lansa Composer) からファイルを呼び出して、問題があったかどうかを確認しています。スクリプトは次のとおりです。

@echo off
@Echo Deleting files older than 14 days...
cd /d C:\Windows\System32
FORFILES /P "[file path...]\IDOC_ARCHIVE" /M *.* /D -14 /C "cmd /c del @file"

問題は、削除するファイルが見つからない場合、スクリプトがエラー コードを返し、"ERROR: No files found with the specified search criteria" を出力することです。問題がある場合にのみエラーを返したいのですが。ディレクトリへのアクセスやdelコマンドの実行など。このスクリプトを取得して「ファイルが見つかりません」というエラーを抑制し、他のユーザーは通過できるようにする方法はありますか?

いくつかのグーグルの後、私はこのページの解決策を試しましたが、最初のケースではすべてのエラーを抑制し、2番目のケースではエラーメッセージのテキストが渡されますが、実際の戻りコードはまだ抑制されています (自動化プロセスが読み取るもの)。

4

8 に答える 8

13

これはその問題を解決するはずです:

@echo off
Echo Deleting files older than 14 days...
cd /d C:\Windows\System32
copy /b forfiles.exe "[file path...]\IDOC_ARCHIVE" >nul
FORFILES /P "[file path...]\IDOC_ARCHIVE" /M *.* /D -14 /C "cmd /c del @file"

14 日以上経過したファイルを提供するため、常に削除され、「ファイルが見つかりません」というメッセージは表示されません。コピーするために forfiles.exe を選択しましたが、14 日より前のファイルを使用できます。他のすべてのエラー メッセージは通常どおり表示されます。

于 2013-05-30T02:35:40.497 に答える
10

2>nul を追加するとうまくいきました。ありがとう!

forfiles /pd:\todayfiles /d +0 /c "cmd /c echo @path" 2>nul | 検索 ":" /c

これにより、基本的にこのコマンドのエラー ストリームが抑制されます。そのため、この操作中に他のエラーが発生しても、それらは発生しません!

于 2015-04-10T05:30:24.033 に答える
6

解決策は、FOR ループで FORFILES コマンドの出力をキャプチャし、ERROR で始まる文字列を検索して、結果を変数に格納することです。そこから、IF/ELSE ディレクティブを使用して、errorlevelそれに応じて を設定できます。コードは次のとおりです(ログとコメントを除く):

cd /d C:\Windows\System32
SET _CmdResult=NONE
FOR /F "tokens=*" %%a IN ('FORFILES /P "[file path...]\IDOC_ARCHIVE" /M *.* /D -14 /C "cmd /c DEL @file" 2^>^&1 ^| FINDSTR ERROR') DO SET _CmdResult=%%a
IF "%_CmdResult%" == "ERROR: No files found with the specified search criteria." ( 
    SET errorlevel=0 
 ) ELSE ( 
    SET errorlevel=1
 )
IF "%_CmdResult%" == "NONE" SET errorlevel=0

>&|FOR ループなどの文字は必ずエスケープしてください。

于 2013-05-30T20:52:39.270 に答える
5

ERRORLEVEL に確実に影響を与えるには、ERRORLEVEL を 0 に設定することが保証されている後続のコマンドを実行する必要があります。次のスニペットのように、コマンド インタープリター自体 (cmd.exe) を使用してこれを行います。

FORFILES  /M:somefiles /D -14 2>nul | cmd /c ""

これが誰かに役立つことを願っています。

于 2013-10-24T10:17:57.700 に答える
4

このすでに貴重なスレッドにささやかな貢献を加えてもよろしいでしょうか。他のソリューションは実際のエラー テキストを取り除く可能性がありますが、アプリケーションの失敗を示す %ERRORLEVEL% を無視しています。そして、「ファイルが見つかりません」というエラーでない限り、正当に %ERRORLEVEL% が必要です。

いくつかの例:

具体的には、エラーをデバッグして排除します。

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||echo found success

oneliner を使用して ERRORLEVEL の成功または失敗を返す:

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT /B 1||EXIT /B 0

ワンライナーを使用して、他のコードの最中にあるバッチファイルのコンテキスト内で成功するために、ERRORLEVEL をゼロに維持します (ver > nul は ERRORLEVEL をリセットします)。

forfiles /p "[file path...]\IDOC_ARCHIVE" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&ECHO found error||ver > nul

SQL Server Agent CmdExec ジョブ ステップの場合、次のようになりました。バグかどうかはわかりませんが、ステップ内の CmdExec はコードの最初の行のみを認識します。

cmd /e:on /c "forfiles /p "C:\SQLADMIN\MAINTREPORTS\SQL2" /s /m *.txt /d -1 /c "cmd /c del @path" 2>&1 |  findstr /V /O /C:"ERROR: No files found with the specified search criteria."2>&1 | findstr ERROR&&EXIT 1||EXIT 0"&exit %errorlevel%
于 2015-04-02T15:25:15.710 に答える
4

これはワンライナーで簡単に解決できます。これを forfiles コマンドに追加するだけです:

2>&1 | find /v /i "ERROR: No files found with the specified search criteria."

したがって、次のようになります。

FORFILES /P "[file path...]\IDOC_ARCHIVE" /M *.* /D -14 /C "cmd /c del @file" 2>&1 | find /v /i "ERROR: No files found with the specified search criteria."

指定したエラー メッセージのみが表示されません。他のすべてのメッセージは.

これがどのように機能するかは次のとおりです。

  • 2>&1STDOUTを送信するのと同じ場所にSTDERRを送信するために使用されます。
  • | find /v /i forfilesからの出力をパイプして検索しますwhere/vは指定された文字列を含まないことを/i意味し、大文字と小文字を区別しないことを意味します
于 2014-06-27T06:47:28.890 に答える