使用Get-childitem获取文件列表 - 类似于$ pattern或者比任何类似文件的$ pattern更新

时间:2017-07-24 09:02:55

标签: powershell

至于现在我有脚本来查找文件-like '*ver1.0*',并且它工作正常。

$files = Get-ChildItem "D:\path\" | where {($_ -like "*$version*.sql")}

文件列表:

file_ver1.0_xx.sql
file_ver1.0_xy.sql

但是现在我需要找到看起来像以前的文件,或者它比它更新。

例如,我需要查找包含模式的文件:*ver1.0**ver0.9* LastWriteTime比任何*ver1.0*文件更新。

2 个答案:

答案 0 :(得分:1)

出于性能原因,我只列举文件一次,使用$version确定文件的最新修改日期,然后过滤包含$version的文件和具有不同版本但更新日期的文件:

$allFiles = Get-ChildItem 'D:\path' -Filter '*.sql' |
            Where-Object { -not $_.PSIsContainer }

$refDate = $allFiles | Where-Object {
    $_.BaseName -like "*$version*"
} | Sort-Object LastWriteTime | Select-Object -Last 1 -Expand LastWriteTime

$files = $allFiles | Where-Object {
    $_.BaseName -like "*$version*" -or
    ($_.BaseName -notlike "*$version*" -and $_.LastWriteTime -gt $refDate)
}

如果你需要实际比较版本号,你可能需要一些更精细的方法,例如,像这样:

$pattern    = 'ver(\d\.\d)'
$refVersion = [version]'1.0'

$allFiles = Get-ChildItem 'D:\path' -Filter '*.sql' |
            Where-Object { -not $_.PSIsContainer }

$refDate = $allFiles | Where-Object {
    $_.BaseName -match $pattern -and
    [version]$matches[1] -eq $refVersion
} | Sort-Object LastWriteTime | Select-Object -Last 1 -Expand LastWriteTime

$files = $allFiles | Where-Object {
    $_.BaseName -match $pattern -and
    ([version]$matches[1] -eq $refVersion -or
    ([version]$matches[1] -lt $refVersion -and $_.LastWriteTime -gt $refDate))
}

答案 1 :(得分:0)

我知道这很丑,但确实有效。

$files = Get-ChildItem "D:\path" | where {($_ -like "*$version*.sql")}
$files += Get-ChildItem "D:\path" | where {($_ -like "*.sql" -notlike "*$version*.sql" -and $_.LastWriteTime -gt $files[0].LastWriteTime)}