none
Как прочитать файл в Powershell в кодировке DOS? RRS feed

  • Вопрос

  • Возник такой вопрос при массовом изменении bat-logon скриптов - осталось наследие в виде русских имен шар.

    читаю $file = get-content -encoding Ascii c:\netlogon\user.bat
    получаю вопросительные значки на консоли. При сохранении  set-content -encoding Ascii -path c:\netlogon\user.bat -value $file
    получаю такие же значки в файле, т.е. русские названия шар "ломаются".
    Опция вроде есть, но она не работает.
    Есть какой-нибудь простой путь решить вопрос?

Ответы

  • Дело в том что cmd использует в командных файлах кодировку cp866...
    Можно конвертировать текст из этой кодировки и обратно с помощью таких функций:

    function ConvertTo-Encoding ([string]$From, [string]$To){
    	Begin{
    		$encFrom = [System.Text.Encoding]::GetEncoding($from)
    		$encTo = [System.Text.Encoding]::GetEncoding($to)
    	}
    	Process{
    		$bytes = $encTo.GetBytes($_)
    		$bytes = [System.Text.Encoding]::Convert($encFrom, $encTo, $bytes)
    		$encTo.GetString($bytes)
    	}
    }
    
    Function ConvertTo-Cp866
    {
        Begin {
        $ll = @'
         ЎўЈ¤Ґ¦§Ё©Є«¬­®Їабвгдежзийклмноп
        '@
        $ul = @'
        ЂЃ‚ѓ„…†‡€‰Љ‹ЊЌЋЏђ‘’“”•–—˜™љ›њќћџ
        '@
        }
        Process{
            [string]::Join("",
                $( [int[]][char[]]$_ | foreach {
                        if ($_ -ge 1072 -and $_ -le 1103)
                        {
                            $_ = [int]$ll[$_ - 1072]
                        }
                        elseif ($_ -ge 1040 -and $_ -le 1071)
                        {
                            $_ = [int]$ul[$_ - 1040]
                        }
                        [char]$_
                    }
                )
            )
        }
    }

    Например:

    PS C:\temp> Get-Content .\batch.cmd
    @echo '?Єбв ў ¤RбRўбЄRc ЄR¤ЁаRўЄ?
    @pause
    PS C:\temp> Get-Content .\batch.cmd | ConvertTo-Encoding cp866 windows-1251
    @echo Текст в досовской кодировке
    @pause
    PS C:\temp> Get-Content .\batch.cmd | ConvertTo-Encoding cp866 windows-1251 | ConvertTo-Cp866
    @echo '?Єбв ў ¤RбRўбЄRc ЄR¤ЁаRўЄ?
    @pause

    Подробности тут:
    http://xaegr.wordpress.com/2007/01/24/decoder/
    http://xaegr.wordpress.com/2008/02/12/decode-2cp866/

    PS: В ConvertTo-cp866 при вставке на форум побились некоторые символы, а ссылка в блоге пока не работает... Так что рабочий файл можно пока взять тут.

    PPS: Если у вас нет компьютеров с Win2000 и более древних, то очень рекомендую переводить управление шарами с батников на Group Policy Preferences. Читать тут, смотреть тут.


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    Модератор