抑制FORFILES"找不到文件"错误

Mal*_*olm 13 batch-file

我正在使用批处理文件来删除超过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"
Run Code Online (Sandbox Code Playgroud)

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

经过一些谷歌搜索,我尝试了这个页面上的解决方案,但它们不能满足我的需求,因为在第一种情况下它会抑制所有错误,在第二种情况下会传递错误消息的文本,但是实际的返回码仍然被抑制(这是自动化过程读取的).

fox*_*ive 11

这应该解决这个问题:

@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"
Run Code Online (Sandbox Code Playgroud)


Mal*_*olm 5

解决方案是在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
Run Code Online (Sandbox Code Playgroud)

只要确保转义任何字符(例如>&|FOR循环中的字符)即可。


Nig*_*gel 5

要可靠地影响 ERRORLEVEL,您需要运行保证将 ERRORLEVEL 设置为 0 的后续命令。我使用命令解释器本身 (cmd.exe) 来执行此操作,如下面的代码片段所示:

FORFILES  /M:somefiles /D -14 2>nul | cmd /c ""
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助某人。


Sti*_*ing 5

我可以为这个已经很有价值的线程添加一个谦虚的贡献吗?我发现其他解决方案可能会消除实际的错误文本,但会忽略 %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
Run Code Online (Sandbox Code Playgroud)

使用 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
Run Code Online (Sandbox Code Playgroud)

使用 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
Run Code Online (Sandbox Code Playgroud)

对于 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%
Run Code Online (Sandbox Code Playgroud)


小智 5

添加2> nul可以解决问题。谢谢!

forfiles / pd:\ todayfiles / d +0 / c“ cmd / c echo @path” 2> nul | 找到“:” / c

这基本上抑制了此命令的错误流。因此,即使执行此操作时出现其他错误,也不会出现!