По мотивам предыдущего поста и срача в ньюсгруппе 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 придётся чуточку подпилить его.