需要 windows 单行批处理命令来按名称删除文件夹,而不是 date.time 使用 powershell(如果适用)

Need windows batch command one-liner to remove folders by name, not by date.time using powershell if applicable

需要命令帮助,例如单行命令、powershell 来删除文件夹 我正在尝试找到一种优雅的方法来通过反映日期的文件夹名称删除文件夹,但我不能依赖 file/folder 日期元数据属性。

这是我要解决的问题: 我有一个文件夹,其中有录音系统创建文件夹并用通话录音填充的每一天的存档通话录音,每天的文件夹命名为格式 MM_dd_yyyy。 我需要删除除最后 7 个文件夹之外的所有文件夹。但是,我不能依赖文件上的 creation/modified 日期。使用 powershell 会容易得多。因此,不幸的是,我必须通过根据我需要以相同格式 (MM_dd_yyyy) 保留的文件夹的日期测试文件名来删除文件夹。 我可以使用以下 Windows 命令行获取前 6 天要保留的文件夹名称列表:

c:\>powershell $d0=(Get-Date).ToString('MM-dd-yyyy'); $d1=(Get-Date).AddDays(-1).ToString('MM-dd-yyyy'); $d2=(Get-Date).AddDays(-2).ToString('MM-dd-yyyy'); $d3=(Get-Date).AddDays(-3).ToString('MM-dd-yyyy'); $d4=(Get-Date).AddDays(-4).ToString('MM-dd-yyyy'); $d5=(Get-Date).AddDays(-5).ToString('MM-dd-yyyy'); $d6=(Get-Date).AddDays(-6).ToString('MM-dd-yyyy'); $d0; $d1; $d2; $d3; $d4; $d5; $d6

注意:由于企业和域强制安全限制,我需要将其保留在命令单行中并且不能使用 PS1 power shell 脚本

这会生成要保留的文件夹名称,如下所列(运行 2021 年 11 月 20 日保留最后 7 天)。

11_20_2021
11_19_2021
11_18_2021
11_17_2021
11_16_2021
11_15_2021
11_14_2021

目的是删除任何类似 11_13_2021、11_12_2021... 等的文件夹名称

我可以在 Windows bat 文件中使用 运行ning 嵌套的 FOR 循环来尝试将其组合在一起,但我正在尝试找到一个更简单、可读和优雅的 -让我做如下事情的班轮: 功率shell $d=(Get-Date).AddDays(-7).ToString('MM-dd-yyyy');然后一些神奇的力量shell 东西来删除任何与要保留的文件夹不匹配的文件夹。

如果我有办法为 (get-date).AddDays(-6) powershell 命令提供文件夹名称 (MM_dd_yyyy) 并让它 return 一个布尔值是或否,那会更接近我正在寻找的东西。 我一直在看书,你用管子拔头发,但到目前为止我正在学习,但大部分时间都把它弄得一团糟。欢迎任何想法。

我可能完全错了。约束是:

给定命名格式为 MM_dd_yyyy 的文件夹列表,我需要 remove/delete 所有不在最后一周的天数。

我无法 运行 增强shell 脚本。ps1 我可以 运行 windows bat 或带有 for 循环的 cmd 文件等等 我不能依赖文件的文件夹 date/time 元属性,文件夹中的某些数据可能有 create/write/modified 与文件夹名称不符的日期。我必须依靠文件夹名称 (MM_dd_yyyy) 来删除文件夹。

更新分辨率:

powershell "($f=Get-ChildItem -Path 'D:\PosConvSav' -Filter '*_*_*' -Directory | Where-Object { $_.Name -match '\d{2}_\d{2}_\d{4}' } | sort-object -desc)[14..($_.count)] | remove-item -recurse"

PowerShell 代码为:

Get-ChildItem -Path 'RootPath\Where\The\Folders\To\Delete\Are\Found' -Filter '*_*_*' -Directory |
    Where-Object { $_.Name -match '\d{2}_\d{2}_\d{4}' } |                   # filter some more using regex -match
    Sort-Object { [datetime]::ParseExact($_.Name, 'MM_dd_yyyy', $null) } |  # sort by date
    Select-Object -SkipLast 7 |                                             # skip the newest 7 folders
    Remove-Item -Recurse -Force                                             # remove the rest

为了安全起见,将 -WhatIf 添加到最后的 Remove-Item 命令中。这样一来,代码实际上并没有删除任何内容,而是在控制台中显示 删除的内容。如果您认为这是正确的,请删除 -WhatIf 以实际删除这些文件夹。

正如 已经评论过的那样,不要认为使用单行代码是最好的,因为你最终得到的代码不再可读,而且错误极难发现寻找。 多行代码没有任何惩罚,事实上这是要走的路!