如何在PowerShell的Rename-Item cmdlet中引用数组元素重命名JSON文件
问题
我需要批量重命名带有en-US后缀的本地化.json文件,把后缀换成数组$array[$i][5]里对应的语言标识(比如法语对应fr.json),但在Rename-Item命令里正确引用数组时出了问题。
试了这段代码:
Get-ChildItem -filter *en-US.json -recurse | rename-item -newname { $_.Name -replace "^(.*?)en-US.json","`$1$array[$i][5]" }
用双引号拼接时报错:
rename-item : 指定的路径、文件名或两者之一过长。完全限定的文件名必须少于260个字符,目录名必须少于248个字符。
换成+连接字符串又报另一个错:
Rename-Item : 参数'NewName'的脚本块输入失败。-ireplace运算符仅允许后跟两个元素,而非三个。
解决方案
问题出在PowerShell对双引号内数组表达式的解析上,直接写$array[$i][5]会被当成纯文本,而不是计算数组取值。可以用两种方法解决:
方法一:提前存储目标后缀
先把数组里的目标后缀存到变量里,再在替换时引用,代码更清晰:
# 先确认$i是正确的索引,比如i=0对应目标语言 $targetSuffix = $array[$i][5] Get-ChildItem -Filter *en-US.json -Recurse | Rename-Item -NewName { $_.Name -replace '^(.*?)en-US\.json', "`$1$targetSuffix" }
方法二:用子表达式计算数组值
在替换字符串里用$()包裹数组表达式,让PowerShell先计算出结果再插入:
Get-ChildItem -Filter *en-US.json -Recurse | Rename-Item -NewName { $_.Name -replace '^(.*?)en-US\.json', "`$1$($array[$i][5])" }
注意点
- 正则表达式里要把
.转义成\.,不然会匹配任意字符,导致错误替换类似en-USx.json的文件。 - 先确认
$array[$i][5]能正确返回目标后缀(比如fr.json),可以先单独运行$array[$i][5]验证取值是否正确。
内容的提问来源于stack exchange,提问作者bom1
相关产品推荐
相关产品推荐

