Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Вырезать начало/ заголовок файла до определённого символа

Ответить
Настройки темы
Любой язык - Вырезать начало/ заголовок файла до определённого символа

Аватара для NickM

Ветеран


Contributor


Сообщения: 4625
Благодарности: 1110


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: NickM
Дата: 08-03-2022
Уважаемые, здравствуйте!

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

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

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

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

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

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

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

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

Отправлено: 09:56, 03-03-2022

 

Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


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

-------
scio me nihil scire. Ѫ


Отправлено: 18:11, 04-03-2022 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для NickM

Ветеран


Contributor


Сообщения: 4625
Благодарности: 1110

Профиль | Отправить PM | Цитировать


Цитата YuS_2:
А во всех файлах в заголовках одинаковое количество символов? Или там заголовки разные? »
Количество разное, обрезка вровень до "AT&TFORM" превращает файл в открываемый *.djvu;

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

Отправлено: 19:40, 04-03-2022 | #3


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата 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

-------
scio me nihil scire. Ѫ


Последний раз редактировалось YuS_2, 05-03-2022 в 17:10.

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:15, 05-03-2022 | #4


Аватара для NickM

Ветеран


Contributor


Сообщения: 4625
Благодарности: 1110

Профиль | Отправить PM | Цитировать


Спасибо!

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

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

Отправлено: 15:56, 05-03-2022 | #5


Аватара для YuS_2

Crazy


Contributor


Сообщения: 1232
Благодарности: 515

Профиль | Отправить PM | Цитировать


Цитата NickM:
Проверил на образце - заголовок отрезает! »
Код немного поправил, а то по шаблону, фактически, проверялся только первый и последний символ...

-------
scio me nihil scire. Ѫ

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:09, 05-03-2022 | #6


Аватара для NickM

Ветеран


Contributor


Сообщения: 4625
Благодарности: 1110

Профиль | Отправить PM | Цитировать


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

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

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

UPD:

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

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

Последний раз редактировалось NickM, 05-03-2022 в 17:40.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:19, 05-03-2022 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » Любой язык - Вырезать начало/ заголовок файла до определённого символа

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Замена символа в строках имеющих определенное начало TRaMeLL Скриптовые языки администрирования Windows 6 26-12-2018 23:41
CMD/BAT - Записать название файла в начало текстового файла krambrige Скриптовые языки администрирования Windows 3 15-12-2018 17:23
CMD/BAT - [решено] Переименовать папки, удалив всё после определённого символа dreamscafe Скриптовые языки администрирования Windows 1 29-06-2018 20:33
Поиск определённого файла на сайте Sfero_ID Хочу все знать 1 09-10-2010 08:24




 
Переход