PowerShell技术问询:如何修改正则表达式代码按下划线分割文件名并提取指定信息
解决PowerShell提取下划线分隔文件名信息的问题
我明白你的需求了——要从格式为CodeID_FileName_DateCode.pdf的文件名里提取三个字段,生成自定义对象后导出到CSV。原来的代码里正则表达式和变量赋值部分不对,我帮你调整好了,下面是完整的可运行代码:
样本数据
123456_FileName1_01012021.pdf 123457_FileName2_01012021.pdf 123458_FileName3_01012021.pdf 123459_FileName4_01012021.pdf 123460_FileName5_01012021.pdf
预期结果
提取每个文件名中的:
- CodeID:文件名开头的数字串(如
123456) - FileName:中间的自定义名称(如
FileName1) - DateCode:末尾的日期串(如
01012021)
生成包含这三个属性的自定义对象集合,最终导出到指定CSV文件。
修改后的PowerShell代码
# 定义输出CSV路径和待处理文件路径 $destinationPath = '\path1\test.csv' $InStuff = @(Get-ChildItem "\path2\" -Name -Recurse) # 如果目标CSV已存在则删除 if (Test-Path $destinationPath) { Remove-Item $destinationPath } # 处理文件名并提取信息 $results = switch -Regex ($InStuff) { # 正则表达式匹配:开头数字_中间任意非下划线字符_数字.pdf结尾 '^(\d+)_([^_]+)_(\d+)\.pdf$' { [pscustomobject]@{ CodeID = $matches[1] # 第一个捕获组:CodeID FileName = $matches[2] # 第二个捕获组:FileName DateCode = $matches[3] # 第三个捕获组:DateCode } } } # 将结果导出到CSV $results | Export-Csv -Path $destinationPath -NoTypeInformation
关键修改说明
- 正则表达式调整:把原来的
'[^-]*'改成了'^(\d+)_([^_]+)_(\d+)\.pdf$',这个正则会精准匹配你的文件名格式:^(\d+):匹配开头的数字串(CodeID)并捕获为第1组_([^_]+)_:匹配中间的非下划线字符(FileName)并捕获为第2组(\d+)\.pdf$:匹配结尾的数字串(DateCode)并捕获为第3组,同时确保文件后缀是.pdf
- 变量赋值优化:直接使用正则捕获组
$matches[1]/[2]/[3]来获取对应字段,不需要额外的-split操作,更高效准确 - 增加导出步骤:原来的代码没写导出CSV的命令,我补上了
Export-Csv,加上-NoTypeInformation避免CSV里生成多余的类型信息
内容的提问来源于stack exchange,提问作者JM1
相关产品推荐
相关产品推荐

