Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Вырезать начало/ заголовок файла до определённого символа (http://forum.oszone.net/showthread.php?t=350795)

NickM 03-03-2022 09:56 2981053

Вырезать начало/ заголовок файла до определённого символа
 
Уважаемые, здравствуйте!

В этой теме, пользователь задавался вопросом замены одной последовательности символов на другую.

Там же была предложена утилита sfk, которая мгновенно выполняла запрошенное.

В моём случае конечно не принципиально, чтобы использовалась именно данная утилита, полагаю подойдет и powershell-сценарий, но признаться честно объём файлов большой.

Описание:
Имеется большое количество файлов, которые на протяжении многих лет создавались в одном из "самописных" приложений, которое естественно уже кануло в лету.

По факту это *.djvu файл со вставкой в заголовок сведений о сертификате/ подписи.

Мне нужно этот заголовок удалить (например все данные до "AT&TFORM") и изменив расширение "превратить" файл в валидный *.djvu для дальнейшего открытия/ просмотра.

Может кто располагает готовым решением или подскажет по теме?

Образец файла прикрепляю.

YuS_2 04-03-2022 18:11 2981117

А во всех файлах в заголовках одинаковое количество символов? Или там заголовки разные?
И ещё, в конце файла тоже присутствует какая-то информация - она мешать не будет?

NickM 04-03-2022 19:40 2981120

Цитата:

Цитата YuS_2
А во всех файлах в заголовках одинаковое количество символов? Или там заголовки разные? »

Количество разное, обрезка вровень до "AT&TFORM" превращает файл в открываемый *.djvu;

Цитата:

Цитата YuS_2
И ещё, в конце файла тоже присутствует какая-то информация - она мешать не будет? »

Этот "шум"/ мусор, открытию файла, не мешает ))

YuS_2 05-03-2022 15:15 2981153

Цитата:

Цитата NickM
Количество разное »

Было бы проще, если бы было одинаковое...
Ну да ладно. Примерно так:
Код:

param (
        [string]$folder = '.\TEST',
        [string]$tmpl = 'AT&TFORM'
)
function RW-Stream {
        param (
                [Parameter(ValueFromPipeline)]
                [ValidateNotNullOrEmpty()]
                $filein,
                $fileout = 'tmp.tmp',
                $template
        )
        begin {
                new-variable -name block -val 524288
                $buf = new-object byte[] ($block)
        }
        process {
                $flag = $true
                $reader = [io.streamreader]::new($filein.fullname)
                $writer = [io.streamwriter]::new($fileout)
                new-variable -name tblock -val 1
                $tbuf = new-object byte[] ($tblock)
                while ($reader.basestream.position -lt $reader.basestream.length -and $flag){
                        $null = $reader.basestream.read($tbuf,0,$tblock)
                        if ([char][int]$tbuf[0] -eq $template[0]){
                                $pos = $reader.basestream.position - 1
                                $i,$flag1 = 1,$true
                                while ($flag1 -and $i -lt $template.length){
                                        $null = $reader.basestream.read($tbuf,0,$tblock)
                                        if ([char][int]$tbuf[0] -eq $template[$i]){
                                                if ($i -eq $template.length-1){
                                                        $flag,$flag1 = $false,$false
                                                        $reader.basestream.position = $pos
                                                }
                                        } else {$flag1 = $false}
                                        $i++
                                }
                        }
                }
                rv tbuf;rv tblock
                while ($reader.basestream.position -lt $reader.basestream.length){
                        $cnt = $reader.basestream.read($buf,0,$block)
                        $writer.basestream.write($buf,0,$cnt)
                }
                $reader.dispose();$writer.dispose()
                $reader.close();$writer.close()
               
                # Если создавать новые файлы не требуется, то исходные файлы будут
                # перезаписаны новыми:
               
                #mi $fileout $($filein.fullname) -force
               
                # Если необходимо переименование в .djvu, то строка выше должна быть
                # закомментирована, а последующая раскомментирована. Создаются файлы
                # с таким же именем, но с расширением djvu. Исходные файлы не изменяются:
               
                mi $fileout $($filein.fullname -replace '\..*$','.djvu') -force
        }
}
dir $folder -file -rec |rw-stream -templ $tmpl


NickM 05-03-2022 15:56 2981154

Спасибо!

Проверил на образце - заголовок отрезает!
Файл в программе просмотра *.djvu открывается корректно.

В ближайшие, рабочие, дни запущу сценарий на наборе файлов.

YuS_2 05-03-2022 17:09 2981156

Цитата:

Цитата NickM
Проверил на образце - заголовок отрезает! »

Код немного поправил, а то по шаблону, фактически, проверялся только первый и последний символ...

NickM 05-03-2022 17:19 2981157

Не стал затягивать и выполнил на наборе из ~97 тыс. файлов - сценарий управился за ~17 минут.
Проверил выборочное открытие файлов - открытие успешное.

YuS_2, ещё раз выражаю благодарность!

Цитата:

Цитата YuS_2
Код немного поправил, а то по шаблону, фактически, проверялся только первый и последний символ... »

Спасибо!
Отработал по первому варианту, как Выше и написал - выборочное открытие файлов проблем не выявило.

UPD:

Но, Я всё же поищу проблемные файлы и напущу на них исправленный вариант сценария.

Да, действительно, такие файлы нашлись, и последний вариант сценария обрабатывает их правильно.


Время: 08:09.

Время: 08:09.
© OSzone.net 2001-