powershell - 如何根据过滤器选择特定的子串长度
问题描述
我有多个名称不同的 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 个字符之后有一个破折号?提前致谢
解决方案
尝试以下(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
作为数组收集到 中。
推荐阅读
- terminal - Fish Shell 如何更改自动提示功能的字体颜色?
- r - 使用自适应窗口计算 data.table 中的滚动最小值
- json - 如果必须发送数组,如何将数据从谷歌表格导入到 mongodb?
- python - Pytorch - Tensorboard - Precision-Recall Curve 只显示一个点
- jquery - 如何隐藏包含具有特定类的另一个元素的所有元素?
- python - 一级发送json数据后代码停止响应
- google-cloud-dataflow - 是否可以在“开始”状态下停止工作?
- google-sheets - 在 Google 表格中将 VLOOKUP() 功能与 QUERY() 结合使用
- selenium - 无法执行自动化测试脚本在 Salesforce 上使用 selenium 为 Salesforce Classic 编写
- javascript - 如何 module.export 在异步函数中定义的值?