我想使用以下脚本将文件名从西里尔字母音译为拉丁字母:
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
并保存:
当然,有一种编程方式可以做到这一点:
Get-Content -Path .\SU\1538755_NoBom.ps1 -Encoding UTF8 |
Set-Content -Path .\SU\1538755_Bom.ps1 -Encoding UTF8
编辑。该问题仅出现在Windows Powershell(powershell.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
)…