首页 > 解决方案 > 如何根据过滤器选择特定的子串长度

问题描述

我有多个名称不同的 CSV 文件,其中包含今天的日期、客户编号和扩展名。例如:

2019-01-23 XYZF-105.csv
2019-01-23 ABCD-205.csv
2019-01-23 Different nonstandard name.csv
2019-01-23 ##ABCD-305(Trial).csv

我想获得仅包含客户编号的名称部分,例如 ABCD-305。

尝试使用子字符串从点开始选择 8 个字符,但这不适用于具有 (Trial) 等后缀的字符。它从一开始就不能工作 11 个字符,因为它将包括 ##。此外,它必须避免使用非标准名称。

我用了

$allitems = Get-ChildItem -Path 'C:\Downloads\Customers\*.csv'
$res = @()
foreach ($item in $allitems){
    $item = $item.Name.substring($item.Name.Length - 12,8)
    $res += $Item
}

这样,对于正确的名称,我会得到很好的结果,但前提是 CSV 的名称类似于 2019-01-23 ABCD-205.csv。

跳过日期,跳过 .csv 扩展名并仅获得 8 个字符的结果应该是什么方法,在第 4 个字符之后有一个破折号?提前致谢

标签: powershellsubstring

解决方案


尝试以下(PSv3+ 语法):

$res = (Get-ChildItem -Path C:\Downloads\Customers\*.csv).Name | 
         Select-String -CaseSensitive '\b[A-Z]{4}-\d{3}\b' |
           ForEach-Object { $_.Matches[0].Value }
  • (Get-ChildItem -Path C:\Downloads\Customers\*.csv).Name输出 dir 中所有 CSV 文件的文件名。C:\Downloads\Customers

  • Select-String -CaseSensitive '\b[A-Z]{4}-\d{3}\b'使用区分大小写的正则表达式(正则表达式)匹配来仅选择包含 4 个 ( {4}) 大写字符的文件名。[A-Z], 后跟-, 后跟 3 位数字 ( \d), 在单词边界 ( \b)

  • 然后,ForEach-Object脚本块输出每个匹配文件名中与正则表达式 ( $_.Matches[0].Value) 匹配的部分,以便仅将匹配文件名的相关部分$res作为数组收集到 中。


推荐阅读