如何检索唯一文件名部分的列表?

如何检索唯一文件名部分的列表?

包含迁移脚本的文件夹包含 SQL 和 PHP 文件,其名称如下:

2015-03-22.23-00.up.sql
2015-03-23.19-00.up.development.sql
2015-03-23.19-00.up.production.sql
2015-03-23.19-00.up.sql
2015-03-23.19-00.up.staging.sql
2015-03-27.14-00.up.php

我想获得所有独特的文件的日期/时间部分。示例文件夹应导致:

2015-03-22.23-00.up
2015-03-23.19-00.up
2015-03-27.14-00.up

注意:上面的部分可能包括也可能不包括。

我想出了这个代码:

$Files = Get-ChildItem -Filter '*.up.*' -File
$Files = $Files | Select BaseName -Unique | Sort-Object BaseName
foreach($File in $Files) {
    $RegEx = '(.*)\.up';
    $FileSchemaVersion = $File.BaseName -replace $RegEx,'$1'

    Write-Line $File
    # Do something
}

不幸的是,列表中还包括了开发、生产、暂存。因此实际结果是:

2015-03-22.23-00.up
2015-03-23.19-00.up.development
2015-03-23.19-00.up.production
2015-03-23.19-00.up
2015-03-23.19-00.up.staging
2015-03-27.14-00.up

如何修复?

我看到两个选择:

  1. up(更好)在检查唯一性和排序之前,删除基本名称中日期时间部分之后的内容,或者在之后的内容(2015-03-23.19-00.up.staging变为2015-03-23.19-00,或者2015-03-23.19-00.up)。为此,我不知道如何有效地注入第二行来实现这一点。
  2. (可以接受)不要将带有后面内容的文件包含在集合up$Files。为此,我还没有找到如何将此条件传递到-Filter第一行的参数中的方法。

答案1

这能满足你的需要吗?

$Files | % {
    $_.Substring(0,16)
    } | Sort -Unique

相关内容