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
相关产品推荐
相关产品推荐

