Из письма в PM:
Скрытый текст
Цитата pzh2393:
Добрый день!
Прошу прощения, что обращаюсь напрямую, но восстанавливать эту тему (http://forum.oszone.net/thread-291932.html) считаю не имеет смысла.
Оказалось, что часть из моих файлов в конце содержат не только символ перевода строки, но и ряд других, включая просто "обнуленные" (00 00 00 00...) последовательности непостоянного размера.
Можно ли подредактировать скрипт таким образом, чтобы удалялся не только последний байт, а все лишние от конца вплоть до FF D9 (по спецификации конец JPEG файла) ?
Прошу помочь, поскольку в скриптописании (особенно на WHS) не силен.
|
Именно что имеет смысл. Надо было писать именно здесь, и затем, если очень хочется, дать ссылку на новое сообщение в PM.
Поскольку непосредственная работа с ByteArray в WSH не предусмотрена — наш выбор PowerShell:
Скрытый текст
Код:
![Выделить весь код](images/misc/selectcode.png)
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
}