Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Windows PowerShell 1.x/2.x/CTP

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
На первую страницук этому сообщениюк последнему сообщению

Открыть новую тему     Написать ответ в эту тему

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
Открыть новую тему     Написать ответ в эту тему

На первую страницук этому сообщениюк последнему сообщению

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Windows PowerShell 1.x/2.x/CTP


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru