PowerShell一维数组多子串截取后重组失败的解决方法求助
PowerShell一维数组多子串截取后重组失败的解决方法求助
嗨,我来帮你排查这个问题~
你现在遇到的核心问题是:直接对数组$fileList调用.Substring()方法时,PowerShell会自动做成员枚举——也就是给数组里的每一个文件名分别执行这个Substring操作,最后得到的是三个独立的子串数组,再用+拼接后就变成了所有子串分开的结果,而不是每个文件名对应的三个子串拼接成单个字符串。
解决方法:对数组中的每个元素单独处理
你需要用ForEach-Object(或者foreach循环)遍历$fileList里的每一个文件名,单独对每个文件名字符串做子串截取和拼接,这样就能得到你想要的BRP 02 110格式的字符串数组了。
修改后的代码可以这样写:
$fileList = @() $labelStr = @() # 获取符合规则的文件名数组 $fileList += (Get-ChildItem -Filter *.tif -Recurse | Where-Object {$_.Name -match '^[0-9]{3} (B|F) [A-Z]{2} ..K..b [0-9]{2}.*'}).Name # 遍历每个文件名,拼接子串后排序去重 $labelStr += $fileList | ForEach-Object { # 对单个文件名执行子串拼接 $_.Substring(27,3) + " " + $_.Substring(16,2) + " " + $_.Substring(0,3) } | Sort-Object | Get-Unique # 现在输出的就是每个元素都是完整拼接字符串的数组了 $labelStr
或者用更简洁的PowerShell字符串插值写法,可读性更好:
$labelStr += $fileList | ForEach-Object { "$($_.Substring(27,3)) $($_.Substring(16,2)) $($_.Substring(0,3))" } | Sort-Object | Get-Unique
为什么原来的代码会失败?
举个简单的例子,如果$fileList里有两个文件名:110 B CC 12K48b 02 SC C 01 BRP.tif和120 F DD 34K56b 05 AB D 02 XYZ.tif,那么:
$fileList.Substring(27,3)会得到数组@("BRP", "XYZ")$fileList.Substring(16,2)会得到数组@("02", "05")$fileList.Substring(0,3)会得到数组@("110", "120")- 用
+拼接这三个数组,最终得到的是@("BRP", "XYZ", "02", "05", "110", "120"),这就是你看到每个子串单独输出的原因。
另外可以小提醒一下:记得确认你的Substring起始索引和长度是正确的,比如如果文件名带有.tif后缀,要确保截取的位置没有包含后缀或者刚好取到目标字符哦~
备注:内容来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

