如何根据过滤器选择特定的子串长度

时间:2019-01-23 22:19:00

标签: powershell substring

我有多个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个字符后带有破折号)的结果? 预先感谢

2 个答案:

答案 0 :(得分:2)

尝试以下操作(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)匹配的每个匹配文件名的一部分,以便仅将匹配文件名的相关部分收集在{{ 1}},作为数组。

答案 1 :(得分:1)

这是使用正则表达式的好时机。 参见https://regex101.com/r/AH00n6/1

并了解以下正则表达式:

.*\s[#]*([A-Z]{4}-[0-9]{3}).*.csv

这只是捕获名称的一个额外功能,但可以让您更深入地了解如何控制正则表达式。