PowerShell 音译过程中出现意外令牌错误

PowerShell 音译过程中出现意外令牌错误

我想使用以下脚本将文件名从西里尔字母音译为拉丁字母:

Get-ChildItem -Attributes !directory+!system | Where-Object {
    $_.BaseName -match '[абвгдеёжзийклмнопрстуфхцчшщъыьэюя]'
} | Rename-Item -NewName {
    '{0}{1}' -f ($_.BaseName -replace 'ний', 'ny' -replace 'сий', 'sy' -replace 'тий', 'ty' -replace 'жд', 'zd' -replace 'ай', 'ay' -replace 'ей', 'ey' -replace 'ёй', 'ey' -replace 'ий', 'iy' -replace 'ия', 'ia' -replace 'ой', 'oy' -replace 'уй', 'uy' -replace 'ый', 'uy' -replace 'эй', 'ey' -replace 'ья', 'ia' -replace 'ье', 'ye' -replace 'ьё', 'ye' -replace 'ьа', 'ia' -replace 'ьи', 'yi' -replace 'ьо', 'yo' -replace 'ьу', 'yu' -replace 'ьы', 'yy' -replace 'ьэ', 'ye' -replace 'ью', 'yu' -replace 'кс', 'x'  -replace 'юй', 'yuy' -replace 'яй', 'yay' -replace 'лю', 'liu' -replace 'ж', 'zh' -replace 'х', 'kh' -replace 'ц', 'ts' -replace 'ч', 'ch' -replace 'ш', 'sh' -replace 'я', 'ya' -replace 'ю', 'yu' -replace 'щ', 'shch' -replace 'ъ', ''   -replace 'ь', ''   -replace 'а', 'a'  -replace 'б', 'b'  -replace 'в', 'v'  -replace 'г', 'g'  -replace 'д', 'd'  -replace 'е', 'e'  -replace 'ё', 'e'  -replace 'з', 'z'  -replace 'и', 'i'  -replace 'й', 'y'  -replace 'к', 'k'  -replace 'л', 'l'  -replace 'м', 'm'  -replace 'н', 'n'  -replace 'о', 'o'  -replace 'п', 'p'  -replace 'р', 'r'  -replace 'с', 's'  -replace 'т', 't'  -replace 'у', 'u'  -replace 'ф', 'f'  -replace 'ы', 'y'  -replace 'э', 'e'), $_.Extension
}

但出现错误PowerShell Unexpected Token '<bunch of gibberish>' in expression or statement。我该如何修复此问题?

答案1

Windows Powershell 无法识别编码 UTF-8没有 字节顺序标记 (BOM)

D:\PShell\SU\1538755_NoBom.ps1
At D:\PShell\SU\1538755_NoBom.ps1:2 char:41
+ ... абвгдеёжзийклмнопрŃŃ‚ŃƒŃ„Ń…Ń†Ń‡ŃˆŃ‰ŃŠŃ‹ŃŚŃŤŃŽŃŹ' |
+                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Unexpected token 'жзийклмнопрŃŃ‚ŃƒŃ„Ń…Ń†Ń‡ŃˆŃ‰ŃŠŃ‹ŃŚŃŤŃŽŃŹ'' in expression
or statement.

解决方案:用Notepad++打开文件,将编码改为UTF-8-BOM并保存:

编码 N++

当然,有一种编程方式可以做到这一点:

Get-Content -Path .\SU\1538755_NoBom.ps1 -Encoding UTF8 | 
  Set-Content -Path .\SU\1538755_Bom.ps1 -Encoding UTF8

编辑。该问题仅出现在Windows Powershellpowershell.exe)因为它是 微软产品

… Microsoft 编译器和口译员以及 Microsoft Windows 上的许多软件,例如记事本将 BOM 视为必需的 神奇数字而不是使用启发式方法。这些工具在将文本保存为 UTF-8 时会添加 BOM,并且除非存在 BOM 或文件仅包含 ASCII,否则无法解释 UTF-8……

其他 Powershell 版本:

  • Powershell 7( pwsh.exe) 可以很好地处理 UTF-8 编码的文件(无论是否存在 BOM,您的脚本都能顺利运行)。
  • 不幸的是,我无法检查这种行为Powershell 核心 6.x ( pwsh.exe)

相关内容