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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:43:16