使用CSV作为PowerShell Get-ChildItem筛选器无结果问题排查
问题描述
我有一个包含扩展名和描述的CSV文件,想导入它作为PowerShell中gci(Get-ChildItem)命令的筛选参数,但执行后没得到预期的JPG文件结果。
我的代码
$extensions=Import-CSV -Path c:\scripts\Media-extension-foto.csv #$extensions=Import-CSV -Path c:\scripts\Media-extension-foto.csv -header extension $extensions.extension $src = "c:\scripts" #gci c:\scripts\ -Include $Extensions.extension #-Force -recurse #gci c:\scripts\ -filter $Extensions.extension #-Force -recurse gci c:\scripts\|where{$_ -like $extensions.extension}
CSV文件内容(测试用)
extension,"description" *.JPEG,JPEG Image *.JPF,JPEG 2000 Image *.JPG,JPEG Image *.JPG_LARGE,Twitter Large JPEG Image
目标文件夹中的JPG文件
Directory: C:\Scripts Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 23/11/2022 11:02 509592 nieuw9754560_02-10.jpg -a--- 23/11/2022 11:02 576486 nieuw9754560_02-15.jpg -a--- 23/11/2022 11:02 641802 nieuw9754560_02-20.jpg -a--- 23/11/2022 11:01 705702 nieuw9754560_02-25.jpg -a--- 23/11/2022 11:01 763249 nieuw9754560_02-30.jpg
解决方法
问题根源
-Like运算符不支持数组匹配:直接用$_ -like $extensions.extension时,PowerShell只会尝试匹配数组的第一个元素,不会遍历所有扩展名模式。-Include参数使用限制:之前注释的-Include需要配合路径末尾加\*(非递归场景)或-Recurse参数,否则只会匹配目录本身,不会匹配文件。
可行的修正方案
方案一:用Where-Object遍历所有扩展名模式
$extensions = Import-CSV -Path c:\scripts\Media-extension-foto.csv $src = "c:\scripts" Get-ChildItem -Path $src | Where-Object { $file = $_ # 遍历所有扩展名,只要有一个匹配就保留文件 $extensions.extension | ForEach-Object { $file.Name -like $_ } -contains $true }
方案二:正确使用-Include参数
如果想要更高效的原生参数筛选,调整路径或添加-Recurse:
$extensions = Import-CSV -Path c:\scripts\Media-extension-foto.csv $src = "c:\scripts" # 非递归筛选当前目录文件,路径末尾加\* Get-ChildItem -Path "$src\*" -Include $extensions.extension # 递归筛选所有子目录中的文件 Get-ChildItem -Path $src -Include $extensions.extension -Recurse
方案三:合并为正则表达式匹配(适合复杂场景)
把所有扩展名模式合并成一个正则表达式,用-Match一次性匹配:
$extensions = Import-CSV -Path c:\scripts\Media-extension-foto.csv # 将通配符转换为正则表达式语法 $regexPattern = ($extensions.extension | ForEach-Object { [regex]::Escape($_).Replace('\*', '.*') }) -join '|' Get-ChildItem -Path c:\scripts | Where-Object { $_.Name -match $regexPattern }
内容的提问来源于stack exchange,提问作者woef
相关产品推荐
相关产品推荐

