PDA

Показать полную графическую версию : [решено] вывод данных с конца файла


pzh2393
02-12-2011, 12:42
Помогите, пожалуйста, со скриптом на VBS, который бы выводил последние два байта файла в текстовом виде.

Dim fso, objFile

Set fso = CreateObject("Scripting.FileSystemObject")
Set objFile = fso.OpenTextFile(filename)

objFile.Skip(0)
If not objFile.AtEndOfStream Then
content_str = bjFile.Read(2)
content=Replace(content_str,Chr(0)," ")
End If
objFile.Close

Этот скрипт выводит два байта с начала, а вот как сделать это для конца файла - ума не приложу!

Kazun
05-12-2011, 17:56
На PowerShell:
Get-Content C:\file.txt -Encoding Byte | Select-Object -Last 2

pzh2393
05-12-2011, 21:47
Благодарю, но к сожалению не подошло. :(

Объясню более детально для чего необходимо...
Скрипт нужен для подключения к плагину Тотала: http://wincmd.ru/plugring/script_wdx.html
Поскольку иных плагинов позволяющих читать файл в HEX виде и выводить в колонку Тотала (нужна сортировка по значению) Гугл не знает, приходится заниматься хирургией гланд через место в которое не светит солнце!

Iska
06-12-2011, 00:48
pzh2393, вот Вам скрипт, «прикручивайте» сами:
Option Explicit

Dim strFileName
Dim intByteCount

Dim objFSO
Dim objSpeechFileStream

Dim lngLength
Dim arrBuff


strFileName = "C:\WINDOWS\notepad.exe"
intByteCount = 2

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objSpeechFileStream = WScript.CreateObject("SAPI.SpFileStream")

If objFSO.FileExists(strFileName) Then
lngLength = objFSO.GetFile(strFileName).Size

With objSpeechFileStream
.Open strFileName

On Error Resume Next

.Seek lngLength - intByteCount

If Err.Number = 0 Then
On Error Goto 0

If .Read(arrBuff, intByteCount) = intByteCount Then
WScript.Echo ConvertByteArray2HexString(arrBuff)
End If
Else
On Error Goto 0
End If

.Close
End With
Else
' Nothing to output
End If

WScript.Quit 0

'=============================================================================
Function ConvertByteArray2HexString(arrByteArray)
Dim i
Dim strValue

strValue = ""

For i = 1 To LenB(arrByteArray)
strValue = strValue & Right("00" & Hex(AscB(MidB(arrByteArray, i, 1))), 2)
Next

ConvertByteArray2HexString = strValue
End Function
'=============================================================================

pzh2393
06-12-2011, 15:13
Большое спасибо!
Правда скрипт выдает ошибку "Expected statement"... не подскажете что это, в каком месте пытаться поправить?

Iska
06-12-2011, 16:09
В окне сообщения об ошибке нажмите Ctrl-C, затем вставьте полученный текст из буфера обмена сюда. Если как-то меняли код — приведите и его.

pzh2393
06-12-2011, 18:21
В коде ничего не менял...
При запуске из под "окон" возвращает значение "4444", что оно значит тоже непонятно, в колонке Тотала дважды пишет - "Expected statement Expected statement" для любых типов файлов.

Iska
06-12-2011, 21:36
При запуске из под "окон" возвращает значение "4444", что оно значит тоже непонятно, »
Правильно, это и есть два последних байта файла «c:\windows\notepad.exe» в шестнадцатеричном представлении.

в колонке Тотала дважды пишет - "Expected statement Expected statement" для любых типов файлов. »
Я привёл образец кода для:
который бы выводил последние два байта файла в текстовом виде. »
Прикручивать его к TC я не планировал и не обещал. Смотрите документацию к плагину и готовые примеры.

Iska
07-12-2011, 12:20
pzh2393, как сделаете — можете сюда же выложить проделанные Вами действия по подключению.

pzh2393
08-12-2011, 11:12
2Iska
В теме посвященной вопросам работы плагина помогли адаптировать Ваш скрипт...
With CreateObject("SAPI.SpFileStream")
.Open FileName
.Seek CreateObject("Scripting.FileSystemObject").GetFile(FileName).Size - 2
If .Read(F, 2) = 2 Then
For i = 1 To LenB(F)
Content = Content & " " & Right("00" & Hex(AscB(MidB(F, i, 1))), 2)
Next
End If
.Close
End With

"Content = " отвечает за вывод значения в колонку Тотала, а "FileName" - для всех файлов.

Подключение к Total Commander:

script.wdx подключается либо обычным способом через "Конфигурация => Настройки => Плагины => WDX.Настройка => Добавить"
либо ручным прописыванием в wincmd.ini строчек
[ContentPlugins]
0=%COMMANDER_PATH%\PLUGINS\wdx\script\script.wdx

script.ini плагина должен выглядеть примерно так:
[Script]
Section=NAME

[NAME]
Script=name.vbs
LongName=1
ParseDirs=0

В самом Тотале создается новый набор колонок "Конфигурация => Настройки => Набор колонок => Новый"
где в любую колонку вписывается [=script.Result], [=script.Result1], [=script.Result2] и тд. в зависимости сколько значений возвращает скрипт ("Content = ", "Content1 = ", "Content2 = " и тд.).

Проверил данный код в Тотал - работает!

Пы.Сы. Ещё раз благодарю, без Вашего кода никто не брался за такую задачу.




© OSzone.net 2001-2012