YuS 2
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Код: <# .SYNOPSIS Перекодирование файлов в одну, указанную кодировку. .Description Скрипт предназначен для перекодирования нескольких или одного файла в единую кодировку. .Parameter SourceFolder Необязательный: Указывает путь к каталогу с исходными файлами. .Parameter DestinationFolder Необязательный: Указывает путь для размещения обработанных файлов. .Parameter Filter Необязательный: Указывает фильтр для выборки файлов. Допустимы маски. .Parameter TargetEncoding Необязательный: Указывает единую кодировку для целевых файлов. .Parameter Chance Необязательный: Указывает вероятность определения кодировки, значение которой влияет на обработку файлов. При значении вероятности автоопределения кодировки меньше указанной в этом параметре, файл будет исключен из обработки. .Parameter Filelog Необязательный: Указывает имя файла, в который будут записываться данные с именем файла, определённой кодировки и вероятностью определения кодировки. .Parameter Fileerrorlog Необязательный: Указывает имя файла, в который будут записываться данные об исключенных из обработки файлах. .Parameter Log Переключатель: При наличии, включается ведение логов. .Example .\script.ps1 Это пример запуска скрипта без параметров. При таком использовании, необходима корректировка параметров в скрипте .Example .\script.ps1 -source 'D:\SRCFOLDER' -dest 'D:\TARGET' -filt '*.txt' -targetenc 'utf8' -chance 0.3 -log Это пример запуска скрипта с указанием всех параметров. Эти параметры будут иметь приоритет перед указанными в скрипте. .Link http://forum.ru-board.com/topic.cgi?forum=33&topic=7685&start=340#16 .Notes Для работы скрипта требуется пакет Ude.Csharp https://www.nuget.org/packages/UDE.CSharp установка пакета nuget вручную: https://docs.microsoft.com/ru-ru/powershell/scripting/gallery/how-to/working-with-packages/manual-download?view=powershell-7.1 или через репозиторий: install-package ude.csharp -source https://www.nuget.org/api/v2 В данном, конкретном случае, установка пакета не требуется, достаточно извлечь из пакета библиотеку ude.dll и разместить её рядом со скриптом. Пакет nuget с расширением .nupkg - это архив. Т.е. скачать пакет по ссылке выше, переименовать расширение в .zip и распаковать. iNNOKENTIY21 - идея и код автоопределения кодировки с помощью пакета Ude.Csharp http://forum.ru-board.com/topic.cgi?forum=33&topic=7685&start=340#14 Created By YuS Version: 1.03 Date: 29/11/2020 Purpose/Change: в виду обнаружения ошибочного определения кодировки и с высоким шансом, добавлено ведение двух логов (ошибок и определения кодировок) Version: 1.02 Date: 28/11/2020 Purpose/Change: Первая версия #> #requires -v 3.0 param ( # Каталог исходных файлов [string] $SourceFolder = '.\CUE', # Целевой каталог для перекодированных файлов [string] $DestinationFolder = '.\CUE\TO', # Фильтр для выборки файлов [string] $Filter = '*.cue', # Целевая кодировка файлов [string] $TargetEncoding = 'UTF-8', # Шанс для исключения файла по автоопределению кодировки, от 0.0 до 1.0 [double] $Chance = 0.1, # Имя файлов для ведения логов определения кодировки [string] $Filelog = 'out.log', [string] $Fileerrorlog = 'err.log', # Переключатель ведения логов [switch] $Log ) add-type -path ude.dll function autoencoding ($f){ [system.io.filestream] $fstream = [system.io.file]::openread($f) [ude.charsetdetector] $chdetect = [ude.charsetdetector]::new() $chdetect.feed($fstream) $chdetect.dataend() $fstream.dispose() if ($chdetect.charset -ne $null) { $t = @($chdetect.charset,$chdetect.confidence) } else { $t = @(0,0) } return $t } $folder = $DestinationFolder + '\' + $targetencoding if (!(test-path $folder)){md $folder|out-null} if (test-path $fileerrorlog -patht leaf){del $fileerrorlog} if (test-path $filelog -patht leaf){del $filelog} if ($psversiontable.psversion.major -gt 5){ if ($targetencoding -eq 'utf8'){$targetencoding = 'utf-8'} } else { if ($targetencoding -eq 'utf-8'){$targetencoding = 'utf8'} } $arr = dir $sourcefolder -filt $filter -file foreach ($item in $arr){ $a = autoencoding $item.fullname add-member -inp $item -notepropertyname Encoding -notepropertyvalue $a[0] add-member -inp $item -notepropertyname ChanceEnc -notepropertyvalue $a[1] } $arr|%{ $file = $_ if ($file.chanceenc -gt $chance){ [io.file]::readalltext($file.fullname,[text.encoding]::getencoding($file.encoding))| out-file $($folder+'\'+$file.name) -enc $targetencoding if ($log){ "{0} - кодировка [{1}] определена с вероятностью {2:P0}" -f $file.fullname,$file.encoding,$file.chanceenc| out-file $filelog -enc $targetencoding -app } } else { if ($log){ "{0} - кодировка не определена или низкий шанс: {1:P0}" -f $file.fullname,$file.chanceenc| out-file $fileerrorlog -enc $targetencoding -app } } } |
| Всего записей: 3218 | Зарегистр. 03-02-2009 | Отправлено: 11:39 28-11-2020 | Исправлено: YuS 2, 05:16 29-11-2020 |
|