如何使用Findstr,然后在批处理文件过程中按日期删除文件

时间:2018-03-28 17:41:30

标签: batch-file findstr

我正在尝试编写一个批处理文件进程,该进程将首先找到所有不包含字符串的文件(我已经获得该部分)然后它将检查以确定该文件是否超过10天(这是我的坚持点)。我之前已经设置了删除文件,删除了10天之前的文件,但我仍然试图弄清楚如何将这些文件组合起来。

@echo off
set "MySearchString=123 abc nyu texas"
for %%a in (C:\Users\xyz\Documents\TEMP\Junk\*.*) do for /f "delims=" %%i in ('echo("%%~na" ^| findstr /i /v "%MySearchString%"') do echo "%%~fa"

最后一次" echo" %% fa"是我希望删除代码的地方。关于我如何能够删除字符串排除结果的任何想法?

谢谢

2 个答案:

答案 0 :(得分:0)

这在PowerShell中更简单,更直接。这是一种方法:

Get-ChildItem "C:\Users\xyz\Documents\TEMP\Junk\*.*" |
  Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-10) } |
  ForEach-Object {
    if ( (Select-String "123 abc nyu texas" $_ | Measure-Object).Count -eq 0 ) {
      Remove-Item $_ -WhatIf
    }
  }

您可以删除-WhatIf参数,以确保要删除的文件符合您的预期。

请注意Select-String使用正则表达式,除非您使用-SimpleMatch参数告诉它不要这样做。

答案 1 :(得分:0)

以下批量代码不是答案,只是对您发布的内容进行了修改。

@Echo Off
Set "MyTargetDir=%UserProfile%\Documents\TEMP\Junk"
Set "MySearchStrings=123 abc nyu texas"
CD /D "%MyTargetDir%" 2>Nul || Exit /B
For /F "Delims=" %%A In ('Dir /B/A-D-S-L^|FindStr /IV "%MySearchStrings%"'
) Do Echo %%A
Pause

对于任务的剩余部分,您显然应该修改Echo命令,Call带有特定代码的标签或直接运行命令;使用%%A。如果目标目录中有许多文件,您甚至可能希望先执行最后写入或创建日期的检查。我目前无法帮助您,因为您没有自己尝试过,(这不是订购服务的代码),而且您提供的信息不足以说明您的不足之处意味着10天。

为了确定文件年龄,我建议使用RoboCopyForFiles作为替代方案。在这个网站上有很多这样做的例子;请仔细阅读一些答案并尝试根据您的具体要求进行修改,如果您没有达到目标,请相应地更新您的问题。

因为你是一个业余爱好者'在批处理文件中,建议您最好学习并使用PowerShell,这样可以更好地执行此任务。

这是一个可能的PowerShell示例:

Get-ChildItem '$Env:UserProfile\Documents\TEMP\Junk\*.*' -Exclude *123*, *abc*, *nyu*, *texas* |
 Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-10) } | Remove-Item -WhatIf