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

How can I use Findstr and then delete a file by the date in a batch file process

我正在尝试编写一个批处理文件进程,它首先会找到所有不包含字符串的文件(我已经知道了那部分),然后它会检查以确定文件是否早于 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" 是我希望放置删除代码的地方。关于如何获取删除字符串排除的结果有什么想法吗?

谢谢

这在 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 参数告诉它不要这样做。

下面的批处理代码不是答案,只是对您发布的内容的修改。

@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 作为替代方法。这个网站上有很多这样做的例子;请通读一些答案并尝试根据您的具体要求修改它们,如果您没有达到目标,请相应地更新您的问题。

因为您是批处理文件的 'amateur',建议您学习和使用 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