You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 14:18:11