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

使用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
解决方法

问题根源

  1. -Like运算符不支持数组匹配:直接用$_ -like $extensions.extension时,PowerShell只会尝试匹配数组的第一个元素,不会遍历所有扩展名模式。
  2. -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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 13:40:35