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

Показать сообщение отдельно

Ветеран


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

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


Из письма в PM:
Скрытый текст
Цитата pzh2393:
Добрый день!

Прошу прощения, что обращаюсь напрямую, но восстанавливать эту тему (http://forum.oszone.net/thread-291932.html) считаю не имеет смысла.

Оказалось, что часть из моих файлов в конце содержат не только символ перевода строки, но и ряд других, включая просто "обнуленные" (00 00 00 00...) последовательности непостоянного размера.

Можно ли подредактировать скрипт таким образом, чтобы удалялся не только последний байт, а все лишние от конца вплоть до FF D9 (по спецификации конец JPEG файла) ?

Прошу помочь, поскольку в скриптописании (особенно на WHS) не силен.

Именно что имеет смысл. Надо было писать именно здесь, и затем, если очень хочется, дать ссылку на новое сообщение в PM.

Поскольку непосредственная работа с ByteArray в WSH не предусмотрена — наш выбор PowerShell:
Скрытый текст
Код: Выделить весь код
Param(
    [string]$sSourceFolder = "E:\Песочница\0411"
)

if(Test-Path -Path $sSourceFolder -PathType Container) {
    Get-ChildItem -Path $sSourceFolder -Recurse -Include "*.jpg", "*.jpeg", "*.jpe" |`
        Where-Object -FilterScript {
            -not $_.PSIsContainer
        } | ForEach-Object -Process {
            $oFileStream = $_.Open([System.IO.FileMode]::Open)
            
            [void]$oFileStream.Seek(-2, [System.IO.SeekOrigin]::End)
            
            if($oFileStream.ReadByte() -eq 0xFF -and $oFileStream.ReadByte() -eq 0xD9) {
                Write-Host "  $($_.Name)"
            } else {
                $bFound = $false
                
                for($i = $oFileStream.Length - 3; $i -ge 0; $i--) {
                    [void]$oFileStream.Seek($i, [System.IO.SeekOrigin]::Begin)
                    
                    if($oFileStream.ReadByte() -eq 0xFF -and $oFileStream.ReadByte() -eq 0xD9) {
                        $oFileStream.SetLength($oFileStream.Position)
                        
                        $bFound = $true
                        break
                    }
                }
                
                if($bFound) {
                    Write-Host "* $($_.Name)" -ForegroundColor Green
                } else {
                    Write-Host "  $($_.Name)" -ForegroundColor Red
                }
            }
            
            $oFileStream.Close()
            $oFileStream.Dispose()
        }
} else {
    Write-Host "Can't find source folder [$sSourceFolder]." -ForegroundColor Red
}
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:14, 06-12-2014 | #8