По мотивам предыдущего поста и срача в ньюсгруппе microsoft.public.windows.powershell перепубликовываю скрипт Роберта Робело для определения кодировки, в которой сохранён файл.
filter Get-TextEncoding { #requires -Version 2.0 begin { [string]$BOM_Unicode = [Text.Encoding]::Unicode.GetPreamble() [string]$BOM_UTF7 = [Text.Encoding]::UTF7.GetPreamble() [string]$BOM_UTF8 = [Text.Encoding]::UTF8.GetPreamble() [string]$BOM_BigEndian = [Text.Encoding]::BigEndianUnicode.GetPreamble() [string]$BOM_UTF32 = [Text.Encoding]::UTF32.GetPreamble() } process { if ($_ -is 'IO.FileInfo') { $bytes = Get-Content -Literal $_.pspath -Encoding Byte -Total 4 -ErrorAction SilentlyContinue $value = if ($bytes) { if ($bytes[0..1] -as 'String' -eq $BOM_Unicode) {'Unicode'} elseif ($bytes[0..2] -as 'String' -eq $BOM_UTF7) {'UTF7'} elseif ($bytes[0..2] -as 'String' -eq $BOM_UTF8) {'UTF8'} elseif ($bytes[0..1] -as 'String' -eq $BOM_BigEndian) {'BigEndian'} elseif ($bytes[0..3] -as 'String' -eq $BOM_UTF32) {'UTF32'} # undetermined, no BOM else {'Unknown'} # undetermined, zero bytes } else {'Unknown'} $_ | Add-Member NoteProperty Encoding $value -PassThru # not an IO.FileInfo } else {$_} } }
ну и использование достаточно простое:
dir *.ps1 | Get-TextEncoding | Format-Table Name, Encoding
Уже тут видно мелкий косячок подсветки в PowerGUI. Name должно быть такого же цвета, что и Encoding. А выглядеть это будет примерно так:
[↓] [vPodans] dir desktop\*.ps1 | Get-TextEncoding | ft name, encoding Name Encoding ---- -------- Untitled1.ps1 BigEndian untitled2.ps1 UTF8 [↓] [vPodans]
Не забудьте, что это будет работать только в V2. Для PowerShell 1.0 придётся чуточку подпилить его.
Comments: