如何在 PowerShell 中根据模式提取文件夹内的文件名

How to extract filename inside the folder based on pattern in PowerShell

我在文件夹

中有四个示例 CSV 文件,如下所示

1234_ABCD_XYZ_Sep 2018_20181130_09-00-18

TestingFile_20181025_CR_090819

FileSample20181130144037-11

SampleFile_20181025_AB_090819

我需要在 Powershell 中提取如下文件名

ABCD_XYZ_Sep 2018

TestingFile_20181025

FileSample20181130

SampleFile_20181025_AB

  1. 提供存储这些 csv 文件的输入父文件夹路径。
  2. 为所有模式创建一个数组
  3. 对于模式列表中的每个模式,循环遍历父文件夹中的每个项目,并比较每个 'file' 项目的名称是否与给定模式匹配。 (只检查文件,不检查文件夹;但是如果适用,递归也用于搜索子文件夹中的任何文件) 继续将每个模式匹配的结果添加到数组列表变量 'filelist'

下面是代码,

# Sample Source Folder Path
$sourceFolderPath = "D:\CSVFilesFolder"

$patterns_array = @(
"ABCD_XYZ_Sep 2018",
"TestingFile_20181025_CR",
"FileSample20181130",
"SampleFile_20181025_AB"
)

$filelist = New-object System.Collections.ArrayList

foreach($pattern in $patterns_array) { 
    $files = gci $sourceFolderPath -Recurse | ? { $_.PSIsContainer -eq $false -and $_.Name -match "*$pattern*.csv" }
    $filelist.Add($files)
}

$filelist

干杯!

~K

我会为此使用正则表达式模式,其中文件名部分与 OR 符号 |:

连接
$re = 'ABCD_XYZ_Sep 2018|TestingFile_20181025_CR|FileSample20181130|SampleFile_20181025_AB'
(Get-ChildItem -Path 'D:\Test' -Filter *.csv -File | Where-Object { $_.BaseName -match $re }).FullName

如果您使用的 PowerShell 版本低于 3.0,请使用此选项代替 -File 开关:

$re = 'ABCD_XYZ_Sep 2018|TestingFile_20181025_CR|FileSample20181130|SampleFile_20181025_AB'
(Get-ChildItem -Path 'D:\Test' -Filter *.csv | Where-Object { !$_.PsIsContainer -and $_.BaseName -match $re }).FullName

输出:

D:\Test34_ABCD_XYZ_Sep 2018_20181130_09-00-18.csv
D:\Test\FileSample20181130144037-11.csv
D:\Test\SampleFile_20181025_AB_090819.csv
D:\Test\TestingFile_20181025_CR_090819.csv