如何在PowerShell中用首行重命名文件时替换重音字符并保留问号
解决方案
需求分析
需要调整PowerShell脚本,实现两个核心目标:
- 将带重音的字符(如é、á)转换为对应的无重音字符(e、a),或直接保留重音
- 保留问号
?,同时仍保留字母、数字和空格
方案1:将重音字符转为无重音字符(兼容所有文件系统)
这个方案会把带重音的字符归一化为无重音版本,同时保留问号,确保文件名在所有系统中都能正常使用:
Get-ChildItem *.txt | Rename-Item -NewName { # 获取首行并去除首尾空白 $firstLine = ($_ | Get-Content -TotalCount 1).Trim() # Unicode归一化:分解重音字符为基础字符+重音标记 $normalizedText = $firstLine.Normalize([Text.NormalizationForm]::FormD) # 移除所有重音标记 $noAccents = [Regex]::Replace($normalizedText, '\p{NonSpacingMark}', '') # 只保留字母、数字、空格、问号,删除其他字符 $cleanName = $noAccents -replace '[^a-zA-Z0-9 ?]', '' # 处理首行清空的情况, fallback到原文件名 if ([string]::IsNullOrWhiteSpace($cleanName)) { $cleanName = $_.BaseName } # 拼接文件名后缀 '{0}.txt' -f $cleanName }
方案2:保留重音字符(适用于支持UTF-8文件名的系统)
如果你的Windows系统已开启UTF-8文件名支持(Windows 10及以上版本可通过区域设置开启),可以直接保留重音字符,同时保留问号:
Get-ChildItem *.txt | Rename-Item -NewName { $firstLine = ($_ | Get-Content -TotalCount 1).Trim() # 保留所有Unicode字母、数字、空格、问号,删除其他字符 $cleanName = $firstLine -replace '[^\p{L}\p{N} ?]', '' # 处理首行清空的情况 if ([string]::IsNullOrWhiteSpace($cleanName)) { $cleanName = $_.BaseName } '{0}.txt' -f $cleanName }
关键说明
Normalize([Text.NormalizationForm]::FormD):将带重音的字符分解为基础字符和独立的重音标记,方便后续移除重音\p{NonSpacingMark}:正则表达式中匹配所有非间距的重音标记字符\p{L}:匹配所有Unicode字母(包括带重音的é、á等),\p{N}匹配所有数字- 增加了空值处理:如果首行处理后为空,会保留原文件名,避免重命名失败
内容的提问来源于stack exchange,提问作者eera5607
相关产品推荐
相关产品推荐

