You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中如何过滤$filesSorted中已存在于$filesAlreadyApplied的FileInfo项

解决方案

方法1:高效写法(推荐,适合文件量较大的场景)

通过哈希集合实现O(1)时间复杂度的存在性校验,性能远优于数组遍历:

# 将已执行的补丁文件名转为大小写不敏感的哈希集合,提升查找效率
$appliedSet = [System.Collections.Generic.HashSet[string]]::new(
    [string[]]$filesAlreadyApplied.PatchFileName,
    [System.StringComparer]::OrdinalIgnoreCase
)

# 过滤仅保留未执行的SQL文件对应的FileInfo对象
$unappliedFiles = $filesSorted | Where-Object {
    -not $appliedSet.Contains($_.BaseName)
}

方法2:简洁写法(适合文件量较小的场景)

直接使用PowerShell内置的-notin操作符实现过滤:

# 提取所有已执行的补丁文件名数组
$appliedNames = $filesAlreadyApplied.PatchFileName
# 过滤未执行文件
$unappliedFiles = $filesSorted | Where-Object BaseName -notin $appliedNames

核心说明

匹配时使用FileInfo对象的BaseName属性,该属性返回不带扩展名的文件名,刚好和你存储在PatchLog表中不带.sql后缀的PatchFileName字段对齐,避免因扩展名导致的匹配失败。

内容的提问来源于stack exchange,提问作者Alex Gordon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 11:27:00