检测含Windows非法字符的文件名:SMB共享迁移至Sharepoint校验问题
核心原理
跨平台SMB共享场景下,Mac端创建的包含Windows文件名非法字符的文件,Windows访问时SMB客户端会统一将这些原始非法字符映射到Unicode私用区U+F000 ~ U+F0FF区间的码点,不同原始字符对应不同的偏移量,不存在统一替换值,但所有转义后的字符都落在上述固定区间内。
检测实现方案
1. 单文件名检测逻辑
直接校验文件名中是否存在码点落在0xF000到0xF0FF范围内的字符即可,无需匹配原始非法字符列表。
2. Powershell批量检测代码
# 扫描指定路径下所有含转义非法字符的文件/文件夹 $scanPath = "\\你的SMB共享路径" $invalidItems = Get-ChildItem -Path $scanPath -Recurse -Force | Where-Object { # 逐个字符校验是否落在SMB转义私用区区间 $_.Name.ToCharArray() | Where-Object { [int]$_ -ge 0xF000 -and [int]$_ -le 0xF0FF } } # 输出所有异常项路径 $invalidItems | Select-Object FullName, Name | Format-Table -AutoSize
3. 可选:还原原始非法字符
如果需要确认原始字符内容,可将转义后的字符码点减去0xF000,即可得到对应的原始ASCII字符:
# 示例:还原转义字符的原始值 $escapedChar = "" # 示例中的转义后字符 $originalChar = [char]([int]$escapedChar - 0xF000) # 输出为原始的非法字符 *
迁移前处理建议
检测到异常文件后,可批量将非法字符替换为下划线_等合法字符,再执行Sharepoint迁移操作,避免迁移失败。
内容的提问来源于stack exchange,提问作者Charlie Patton
相关产品推荐
相关产品推荐

