PowerShell替换文本STRING:开头行时无法正确带入无扩展名文件名问题
故障原因
脚本替换后文件名丢失的核心原因是管道对象类型错误:
- 你通过
Select -expand fullname将Get-ChildItem输出的文件对象转成了纯字符串格式的完整路径 - 字符串类型的路径没有
BaseName属性,因此$($_.BaseName)实际取值为空,最终替换结果就只有STRING:前缀,没有拼接文件名
修正后可直接运行的脚本
$src = "C:\Input" Get-ChildItem $src -Recurse -Filter *.mi | ForEach-Object { (Get-Content $_.FullName) -replace "^STRING: .+", "STRING: $($_.BaseName)" | Set-Content $_.FullName }
修改点说明
- 移除了
Select -expand fullname步骤,直接在循环中处理Get-ChildItem输出的原生文件对象,此时$_.BaseName可以正确读取到当前文件不含扩展名的文件名 - 正则匹配增加了行首锚点
^,仅匹配行开头为STRING:的目标行,避免误替换文本行中间出现的同格式内容 - 如果需要指定输出文件编码,可在
Set-Content后追加-Encoding参数,例如Set-Content $_.FullName -Encoding UTF8,避免默认编码导致的中文乱码问题
内容的提问来源于stack exchange,提问作者SvenVD
相关产品推荐
相关产品推荐

