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"

问题是脚本返回一个错误代码并打印“错误:没有找到具有指定搜索条件的文件”,如果它没有找到任何要删除的文件,而我真的只希望它在出现问题时返回错误访问目录或运行 del 命令等。有什么方法可以让这个脚本抑制“找不到文件”错误,但允许其他人通过?

经过一些谷歌搜索后,我尝试了此页面上的解决方案,但它们不适用于我想要的,因为在第一种情况下它会抑制所有错误,而在第二种情况下,错误消息的文本被传递,但实际的返回码仍然被抑制(这是自动化过程读取的内容)。

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

这很容易用一个衬垫解决。只需将其附加到您的 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>&1用于将 STDERR 发送到我们发送 STDOUT 的同一位置
  • | find /v /i 管道输出forfiles查找where/v表示不包含指定字符串并且/i表示不区分大小写
于 2014-06-27T06:47:28.890 回答
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

在其他代码中间的批处理文件的上下文中,使用 oneliner 将 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 代理 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 回答
1

尝试在脚本之后添加

2>Nul 

例子

SET Days=14

FORFILES /S /M *.* /D -%Days% /C "CMD /C DEL @file" 2>Nul

希望有帮助。

于 2019-07-04T05:11:59.897 回答
0

尝试在我的分机硬盘上删除年度备份中的重复项时,我遇到了同样的问题。在互联网上搜索到的解决方案(在命令参数中添加@path、省略)都没有对我有用。cmd /c系统询问“你确定...”让我想到了以下解决方案:使用/q参数。结果擦除了我的 2016 目录中的 2015 文件:

forfiles /p G:\YearlyBU\Mine\16-12-29\IMeMine\Documents /s /c "cmd /c del @path @file /q"  /d -1100
于 2019-01-22T14:21:26.373 回答