Компьютерный форум 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=221999)

pzh2393 02-12-2011 12:42 1807913

вывод данных с конца файла
 
Помогите, пожалуйста, со скриптом на 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 1809766

На PowerShell:
Код:

Get-Content C:\file.txt -Encoding Byte | Select-Object -Last 2

pzh2393 05-12-2011 21:47 1809924

Благодарю, но к сожалению не подошло. :(

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

Iska 06-12-2011 00:48 1810010

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 1810365

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

Iska 06-12-2011 16:09 1810404

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

pzh2393 06-12-2011 18:21 1810484

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

Iska 06-12-2011 21:36 1810593

Цитата:

Цитата pzh2393
При запуске из под "окон" возвращает значение "4444", что оно значит тоже непонятно, »

Правильно, это и есть два последних байта файла «c:\windows\notepad.exe» в шестнадцатеричном представлении.

Цитата:

Цитата pzh2393
в колонке Тотала дважды пишет - "Expected statement Expected statement" для любых типов файлов. »

Я привёл образец кода для:
Цитата:

Цитата pzh2393
который бы выводил последние два байта файла в текстовом виде. »

Прикручивать его к TC я не планировал и не обещал. Смотрите документацию к плагину и готовые примеры.

Iska 07-12-2011 12:20 1810917

pzh2393, как сделаете — можете сюда же выложить проделанные Вами действия по подключению.

pzh2393 08-12-2011 11:12 1811506

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 = " и тд.).

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

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


Время: 08:12.

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