Powershell 文件夹列表过滤器

Cap*_*nch 2 sorting powershell date chronological

我有一个文件夹,里面有一个子文件夹/文件列表

  • 2022年
  • 20221101
  • 20221103
  • 20221107
  • 20221108
  • 测试123
  • 结果
  • 测试.txt

使用Powershell

  1. 如何获取日期文件夹列表。
  2. 如何获取第二个最新文件夹 (20221107)。

这是我到目前为止所能得到的:

Get-ChildItem "C:\code\Test" -Filter "2022*" | Sort-Object Name -Descending
Run Code Online (Sandbox Code Playgroud)

San*_*zon 5

您可以使用fromTryParseExact方法DateTime来解析文件夹名称并避免任何类型的错误,这可以与Sort-Object和结合使用Select-Object以获得第二个最新的。我已添加-Directory到仅输出文件夹。还将您的过滤器更改为,-Filter "2022????"以确保您匹配以 4 个字符开头2022且后跟 4 个字符的文件夹。

$ref = [ref] [datetime]::new(0)

Get-ChildItem "C:\code\Test" -Filter "2022????" -Directory | Sort-Object {
    $result = [datetime]::TryParseExact(
        $_.Name,
        'yyyyMMdd',
        [cultureinfo]::InvariantCulture,
        [Globalization.DateTimeStyles]::AssumeLocal,
        $ref
    )
    if($result) { $ref.Value }
} -Descending | Select-Object -Index 1
Run Code Online (Sandbox Code Playgroud)

如果您想确保将文件夹与日期格式匹配(因为-Filter可能过于宽松),您可以Where-Object通过正则表达式通过管道进行额外过滤:

$ref = [ref] [datetime]::new(0)

Get-ChildItem "C:\code\Test" -Filter "2022????" -Directory |
    Where-Object Name -Match '^2022\d{4}$' | Sort-Object {
        # rest of the code here
    } -Descending | Select-Object -Index 1
Run Code Online (Sandbox Code Playgroud)

  • 理解,@Santiago - 记住所有规则和例外是一种痛苦。我也没有看到“-Filter”和“?”与目录的问题_在这种情况下_,但请注意,总的来说它仍然过于宽松;例如,“Get-ChildItem ~ -Filter Deskto???”仍然匹配“Desktop”。 (2认同)