当前位置: 首页 > 知识库问答 >
问题:

如何创建输出到日志文件的批处理文件

燕实
2023-03-14

我想创建从任务计划程序运行的批处理文件

要求:

  1. 少于30天的文件应从主文件夹移动到存档文件夹
  2. 然后应删除移动的存档文件
  3. 它应该存储所有日志条目

我已经编写了步骤脚本

步骤脚本

forfiles /p "D:\Test" /m *.* /s /d -30 /c "cmd /c move @file E:\Test1"
forfiles /p "E:\Test1" /c "cmd /c del @path"

有人能告诉我如何使用上述两个命令创建日志文件吗。

日志文件应存储其移动的所有文件名

共有1个答案

高自怡
2023-03-14

首先将文件从驱动器D:移动到驱动器E:这需要复制每个文件的数据,然后删除驱动器E上的每个文件是完全没有意义的:。直接在驱动器D:上删除超过29天的文件要快得多。

下面的批处理文件可用于文件删除任务,并记录每个文件删除的成功或错误。

@echo off
if "%~1" == "" goto RunForFiles
del /A /F %1 2>nul
(if not exist %1 (echo %DATE% %TIME% Deleted successfully:  %1) else echo %DATE% %TIME% Failed to delete file: %1)>>"E:\LogStoragePath\OldFileDeletionLog.txt"
exit /B

:RunForFiles
md "E:\LogStoragePath" 2>nul
del "E:\LogStoragePath\OldFileDeletionLog.txt" 2>nul
%SystemRoot%\System32\forfiles.exe /P "D:\Test" /M *.* /S /D -30 /C "%SystemRoot%\System32\cmd.exe /D /S /C \"if @isdir == FALSE \"%~f0\" @path\""

批处理文件首先检查是否在没有任何参数的情况下被调用,这是由计划任务启动的批处理文件的情况。在这种情况下,处理批处理文件将继续执行

首先创建日志文件的目录(树),而不检查是否可以成功完成。已存在日志文件目录上的命令MD输出的错误消息为

接下来,可能来自上一次执行的日志文件将被删除,并使用2进行抑制

然后执行FORFILES以在中搜索

  • 目录D:\Test用路径选项指定
  • 及其所有子目录,因为选项
  • 对于文件系统条目(目录、文件和重分析点)
  • 匹配通配符模式* (任意)用掩码选项指定
  • 最后修改日期小于或等于30天
  • 执行用选项C指定的命令

该命令导致运行一个以上的Windows命令处理器,选项为

启动的Windows命令处理器进程首先使用区分大小写的字符串比较检查FORFILES找到的上次修改日期早于29天的当前文件系统条目是否不是目录。一个目录被忽略,并导致立即关闭startedcmd。exe

对于文件,下一步由startedcmd执行。exe当前处理的批处理文件,其完整文件名包含在作为参数的中。因此,由cmd.exe处理的批处理文件将运行forfiles.exe,这将启动另一个cmd.exe来处理同一批处理文件,但这次将文件名作为批处理文件的参数。

这一次,批处理文件处理将在第三个命令行上继续进行,该命令使用带选项DEL(所有属性)的命令DEL来推翻隐式默认值A-H(所有属性,隐藏属性除外),以同时删除具有隐藏属性集的文件,并使用选项DEL强制删除具有只读属性集的文件。

在大多数情况下,文件删除最有可能成功。但是,如果应用程序当前打开的文件超过29天或具有特殊NTFS权限,则可能导致文件删除失败。

因此,IF条件用于验证文件是否真的不再存在,在这种情况下,将输出一条成功消息,使用带有动态变量的命令ECHO处理STDOUT。否则,在文件删除失败时,将输出一条失败消息,并带有ECHO,其中包含处理STDOUT的日期和时间。输出消息将重定向到指定的日志文件,并附加到此日志文件上,该日志文件将为每个要删除的文件打开、修改和关闭。

最后,使用命令EXIT退出批处理文件以删除旧文件的执行,使用选项/B只是退出批处理文件,而不是整个cmd.exe处理此批处理文件。cmd.exeforfiles.exe启动,没有更多的事情要做并关闭,这会导致forfiles.exe搜索与指定条件匹配的下一个文件系统条目。

使用此批处理文件时,整个文件删除任务的速度非常慢。对于此任务,最好使用由Windows PowerShell处理的小PowerShell脚本,这样可以更快地完成此文件删除任务。

我还建议阅读我关于Bat文件的回答中的“最佳和简单备份删除概念”一章,以便仅在存在较年轻的文件时删除文件。通常,不建议在不检查是否存在较年轻的文件的情况下简单地删除所有早于X天的文件,尤其是如果要删除的文件是定期执行任务的备份文件或日志文件。在参考答案中发布的解决方案使用不同于上次修改日期的删除策略,也比在此处发布的解决方案快得多。

这里也是上面的一个变体,首先将每个旧文件从D:\Test及其子目录移动到E:\Test1,而不复制目标目录中的目录树,并记录文件移动的成功或失败,最后删除E:\Test1中的所有文件,同时记录文件删除的成功或失败。文件删除失败的可能性很小。

@echo off
if "%~1" == "" goto RunForFiles
move /Y %1 "E:\Test1\" >nul 2>nul
(if not exist %1 (echo %DATE% %TIME% Moved successfully:  %1) else echo %DATE% %TIME% Failed to move file: %1)>>"E:\LogStoragePath\OldFileMoveLog.txt"
exit /B

:RunForFiles
md "E:\Test1" 2>nul
md "E:\LogStoragePath" 2>nul
del "E:\LogStoragePath\OldFileMoveLog.txt" 2>nul
%SystemRoot%\System32\forfiles.exe /P "D:\Test" /M *.* /S /D -30 /C "%SystemRoot%\System32\cmd.exe /D /S /C \"if @isdir == FALSE \"%~f0\" @path\""
set "ProcessedFile="
(echo %DATE% %TIME%
 for %%I in ("E:\Test1\*") do (
    set "ProcessedFile=1"
    del /A /F "%%I" 2>nul
    if not exist "%%I" (echo Deleted successfully:  %%~nxI) else Failed to delete file: %%~nxI
))>"E:\LogStoragePath\OldFileDeletionLog.txt"
if exist "E:\LogStoragePath\OldFileDeletionLog.txt" if not defined ProcessedFile del "E:\LogStoragePath\OldFileDeletionLog.txt"

最后一个命令行在创建时删除文件删除日志文件,但只包含日期和时间,因为之前没有移动文件,因此根本不需要删除文件。

要了解使用的命令及其工作方式,请打开命令提示窗口,在那里执行以下命令,并仔细阅读为每个命令显示的所有帮助页。

  • cmd/?
  • del/?
  • 回声/?
  • 退出/?
  • for/?
  • forfile/?
  • goto/?
  • 如果/?
  • md/?
  • 移动/?
  • 设置/?

另请参见有关使用命令重定向操作符的Microsoft文档。

 类似资料:
  • 我好像拿不到滚动日志文件。 我的logback.xml配置有以下内容: 有意思。SIFT中“unknown.log”文件中的条目在分钟的停止处停止。之后,不会向SIFT文件写入任何内容,但我一直在catalina.out中获取条目:

  • 问题内容: 我用心搜寻了!我试图弄清楚如何从Windows命令行执行java时输出java类可能给出的任何错误。 例如 如果该行引发任何错误,我希望将它们存储到文本文件中,以便以后进行检查。 我试过了 但是,尽管抛出错误,log.txt文件还是空的。 谢谢大家! 问题答案: 用: 2重定向错误流。

  • 问题内容: 我正在尝试配置log4j以将消息记录到文件中。现在,确实使用我提供的名称创建了该文件,但是日志未写入该文件。我的代码: 我文件的内容: 运行此命令时,将在控制台中获得以下输出: 该文件确实在我的主目录中创建。但是它是空的。 有什么想法我做错了吗?我正在使用log4j 1.2.17版。 问题答案: 输出似乎是Java标准日志记录框架(JUL)发出的默认格式。 因此,有两种可能性(想到):

  • 总之,我有一个要求,在使用Spring批处理时,我确实生成了最终结果文件。生成文件后,我需要使用SFTP将它们传输到另一个服务器。现在我把它们看成是两个独立的程序。有没有办法让我把这两个结合起来?我想知道我是否可以使用Spring批处理生成文件,然后立即将文件传输到生成文件的同一程序中的另一个服务器。 我是一个新的Spring批次,所以寻找可能的方法。 不确定为什么会出现连接超时错误。 XML配置

  • 我有将日志保存到文件配置,但日志会附加到现有内容。我想创建总是新的文件。我怎么能那样做? 我的log4j2.xml:

  • 我使用log4j进行日志记录,并且使用.log格式的所有日志文件,其结构简单,如; log4j.rootcategory=info,C,R log4j.appender.c=org.apache.log4j.consoleappender log4j.appender.c.layout=org.apache.log4j.patternlayout log4j.appender.r.layout=o