Пометить файл/папку
Select messages from
# through # FAQ
[/[Print]\]
Goto page Previous  1, 2, 3, 4, 5, 6, 7  Next  :| |:
Total Commander -> Автоматизация Total Commander

#31:  Author: BatyaLocation: Москва, Россия PostPosted: Mon Aug 28, 2006 16:24
    —
Постарался сделать универсальный вариант. Теперь скрипт один, и режим его работы зависит от переданных параметров.
Code:
'==========================================================================================
' Массовое Добавление\Удаление\Замена комментария (descript.ion), переданного параметром
'
' В качестве параметров указать:
' %L "%Pdescript.ion" {Комментарий} {Режим работы с комментарием} {Режим места комментария}
' Если в качестве комментария передать "", то для комментария будет использоваться
'   содержимое буфера обмена
' Режим работы с комментарием:
' 1 - Добавление
' 2 - Удаление
' 3 - Инверсия
' Режим места комментария (можно не указывать, по умолчанию - 1):
' 1 - Начало
' 2 - Конец
' 3 - Полностью
' Пример параметров для добавления комментария "####" в начало:
' %L "%Pdescript.ion" "####" 1 1
'==========================================================================================
Option Explicit

If WScript.Arguments.Count < 4  Then
  MsgBox "Неправильно указаны параметры", _
         vbOKOnly + vbExclamation, _
         "Работа с комментариями"
  WScript.Quit
End If
If WScript.Arguments(3) < 1 Or WScript.Arguments(3) > 3 Then
  MsgBox "Неправильно указан режим работы с комментарием", _
         vbOKOnly + vbExclamation, _
         "Работа с комментариями"
  WScript.Quit
End If
Dim Mode2
If WScript.Arguments.Count < 5  Then
  Mode2 = 1
Else
  Mode2 = WScript.Arguments(4)
End If
If Mode2 < 1 Or Mode2 > 3 Then
  MsgBox "Неправильно указан режим места комментария", _
         vbOKOnly + vbExclamation, _
         "Работа с комментариями"
  WScript.Quit
End If
Dim CommLabel
CommLabel = WScript.Arguments(2)
If CommLabel = "" Then
  Dim TCS
  Set TCS   = CreateObject("TCScript.Helper")
  CommLabel = TCS.GetTextFromClip
  Set TCS   = Nothing
  If CommLabel = "" Then
    MsgBox "Не определен комментарий", _
           vbOKOnly + vbExclamation, _
           "Работа с комментариями"
    WScript.Quit
  End If
  CommLabel = Replace(CommLabel, vbNewLine, " ")
  CommLabel = Replace(CommLabel, Chr(10),   " ")
  CommLabel = Replace(CommLabel, Chr(13),   " ")
End If

Dim FSO, oTextFile, OTF, oCommFile
Dim AllText, FileName, CommFile, BegFile, BegFileComm, EndFileComm
Dim Mode1, CompareComm, FindComm, LenC
Set FSO  = CreateObject("Scripting.FileSystemObject")
CommFile = WScript.Arguments(1)
Mode1    = WScript.Arguments(3)
LenC     = Len(CommLabel)

If FSO.FileExists(CommFile) Then
  Set oTextFile = FSO.OpenTextFile(CommFile, 1)
  On Error Resume Next 'Игнорируем ошибку, если файл пустой
    AllText = oTextFile.ReadAll
  On Error GoTo 0
  oTextFile.Close
Else
  On Error Resume Next
  Set oTextFile = FSO.CreateTextFile(CommFile)
  If Err.Number = 0 Then
    oTextFile.Close
    Set oCommFile = FSO.GetFile(CommFile)
    oCommFile.Attributes = oCommFile.Attributes Or 2 'Hidden
    Set oCommFile = Nothing
    AllText = ""
  Else
    MsgBox "Создание " & CommFile & " невозможно из-за ошибки:" & vbNewLine & Err.Description, _
           vbOKOnly + vbCritical, _
           "Работа с комментариями"
    Err.Clear
    Set oTextFile = Nothing
    Set FSO       = Nothing
    WScript.Quit
  End If
End If

Set OTF = FSO.OpenTextFile(WScript.Arguments(0), 1)
Do While Not OTF.AtEndOfStream
  FileName = OTF.ReadLine
  If FSO.FileExists(FileName) Then
    FileName = FSO.GetFile(FileName).Name
  Else
    FileName = FSO.GetFolder(FileName).Name
  End If
  If InStr(1, FileName, " ", 1) > 0 Then
    FileName = """" & FileName & """"
  End If
  BegFile = InStr(1, vbNewLine & AllText, vbNewLine & FileName & " ", 1)
  If BegFile > 0 Then 'Есть какой-то комментарий для текущего файла
    BegFileComm = BegFile + Len(FileName) + 1 'Позиция начала комментария
    EndFileComm = InStr(BegFileComm, AllText & vbNewLine, vbNewLine, 1) 'Конец комментария + 1
    If EndFileComm - BegFileComm < LenC Then 'Существующий комм. не равен указанному
      FindComm = 0
    Else 'Поверяем дальше
      CompareComm = Mid(AllText, BegFileComm, EndFileComm - BegFileComm)
      If StrComp(CompareComm, CommLabel, 1) = 0 Then 'Существующий комм. = указанному
        FindComm = 2
      Else
        Select Case Mode2
        Case 1 'Начало
          If InStr(1, Left(CompareComm, LenC), CommLabel, 1) > 0 Then
            FindComm = 1
          Else
            FindComm = 0
          End If
        Case 2 'Конец
          If InStr(1, Right(CompareComm, LenC), CommLabel, 1) > 0 Then
            FindComm = 1
          Else
            FindComm = 0
          End If
        Case 3 'Полностью
          FindComm = 0
        End Select
      End If
    End If
    If FindComm = 0 Then 'Существующий комм. не равен указанному
      If Mode1 = 1 Or Mode1 = 3 Then 'Добавляем комментарий
        Select Case Mode2
        Case 1 'Начало
          AllText = Left(AllText, BegFileComm - 1) & CommLabel & " " & Mid(AllText, BegFileComm)
        Case 2 'Конец
          AllText = Left(AllText, EndFileComm - 1) & " " & CommLabel & Mid(AllText, EndFileComm)
        Case 3 'Полностью
          AllText = Left(AllText, BegFileComm - 1) & CommLabel & Mid(AllText, EndFileComm)
        End Select
      End If
      If Mode1 = 2 Or Mode2 = 3 Then 'Удаление комментария полностью
        AllText = DelLine(AllText, BegFile, EndFileComm)
      End If
    ElseIf FindComm = 1 Then 'Указанный комментарий есть
      If Mode1 = 2 Or Mode1 = 3 Then 'Удаляем комментарий
        Select Case Mode2
        Case 1 'Начало
          AllText = Left(AllText, BegFileComm - 1) & Mid(AllText, BegFileComm + LenC + 1)
        Case 2 'Конец
          AllText = Left(AllText, EndFileComm - LenC - 2) & Mid(AllText, EndFileComm)
        Case 3 'Полностью
          AllText = DelLine(AllText, BegFile, EndFileComm)
        End Select
      End If
      If Mode1 = 1 Or Mode2 = 3 Then 'Добавление комментария полностью
        AllText = Left(AllText, BegFileComm - 1) & CommLabel & Mid(AllText, EndFileComm)
      End If
    Else 'FindComm = 2 - Существующий комментарий равен указанному
      If Mode1 = 2 Or Mode1 = 3 Then 'Удаляем комментарий
        AllText = DelLine(AllText, BegFile, EndFileComm)
      End If
    End If
    ' Обработаем после удаления
    If Mode1 = 2 Or (Mode1 = 3 And (FindComm = 1 Or FindComm = 2)) Then
      'Удаление лишних пробелов
      If Instr(BegFile, AllText, FileName & "  ", 1) > 0 Then
        AllText = Left(AllText, BegFileComm - 2) & Mid(AllText, BegFileComm)
      End If
      'Удаление пустых комментариев
      If Instr(BegFile, AllText & vbNewLine, FileName & " " & vbNewLine) > 0 Then
        AllText = Left(AllText, BegFile - 1) & Mid(AllText, BegFile + Len(FileName & " " & vbNewLine))
      End If
      'Удаление лишних концевых строк
      If Right(AllText, Len(vbNewLine)) = vbNewLine Then
        AllText = Left(AllText, Len(AllText) - Len(vbNewLine))
      End If
      'Повторим, на всякий случай
      If Right(AllText, Len(vbNewLine)) = vbNewLine Then
        AllText = Left(AllText, Len(AllText) - Len(vbNewLine))
      End If
      If Len(AllText) = 0 Then
        FSO.DeleteFile(CommFile)
      End If
    End If
    If Len(AllText) > 0 Then
      On Error Resume Next
      Set oTextFile = FSO.OpenTextFile(CommFile, 2)
      If Err.Number = 0 Then
        oTextFile.Write AllText
        oTextFile.Close
      Else
        MsgBox "Запись в " & CommFile & " невозможна из-за ошибки:" & vbNewLine & Err.Description, _
               vbOKOnly + vbCritical, _
               "Работа с комментариями"
        Err.Clear
        Exit Do
      End If
      On Error GoTo 0
    End If
  Else 'Нет комментариев для файла
    If Mode1 = 1 Or Mode1 = 3 Then 'Добавляем комментарий
      On Error Resume Next
      Set oTextFile = FSO.OpenTextFile(CommFile, 8, 2)
      If Err.Number = 0 Then
        If (Right(AllText, Len(vbNewLine)) <> vbNewLine) And (AllText <> "") Then
          oTextFile.WriteLine
          AllText = AllText & vbNewLine
        End If
        oTextFile.Write FileName & " " & CommLabel
        oTextFile.Close
        AllText = AllText & FileName & " " & CommLabel
      Else
        MsgBox "Запись в " & CommFile & " невозможна из-за ошибки:" & vbNewLine & Err.Description, _
               vbOKOnly + vbCritical, _
               "Работа с комментариями"
        Err.Clear
        Exit Do
      End If
      On Error GoTo 0
    End If
  End If
Loop

OTF.Close
Set oTextFile = Nothing
Set oCommFile = Nothing
Set OTF       = Nothing
Set FSO       = Nothing
WScript.Quit

Function DelLine(FullText, BegLine, EndLine)
  If BegLine > Len(vbNewLine) Then
    DelLine = Left(FullText, BegLine - 1 - Len(vbNewLine)) & Mid(FullText, EndLine)
  ElseIf EndLine - 1 + Len(vbNewLine) <= Len(FullText) Then
    DelLine = Left(FullText, BegLine - 1) & Mid(FullText, EndLine + Len(vbNewLine))
  Else
    DelLine = ""
  End If
End Function


Last edited by Batya on Thu Aug 31, 2006 11:41; edited 3 times in total

#32:  Author: fa1con PostPosted: Mon Aug 28, 2006 22:00
    —
Работает. Но ещё надо проверять descript.ion на возможность записи. А то неприятная ошибка выскакивает. Ещё вылазит «path not found» если попытаться пометить что-то в папке My Computer, например. Но это из той же оперы вроде.

#33:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Aug 29, 2006 09:32
    —
fa1con
Давай подробней. Каким образом "неприятная ошибка выскакивает"?
My Computer это виртуальная папка? Если это так, то это не ко мне, а к Гислеру - сколько раз уж говорилось, что работа в TC с такими папками организована крайне плохо. Если же это не виртуальная папка, то как повторить ошибку? На какой именно строке ругается?

#34:  Author: fa1con PostPosted: Tue Aug 29, 2006 13:28
    —
Line: 164, Permission denied
descript.ion с атрибутом Read only.

Line: 61, Permission denied
Файл из каталога, доступ к которому закрыт на запись (шара в сети, например).

Line: 61, Path not found
\\Сетевое окружение\\AceHelper
\\workgroup\comp_name
\\comp_name\share_name
\\Мой компьютер\C:\
\\Панель управления\Назначенные задания\
Виртуальные папки, как ты сказал. Я не силен в программировании, особенно в VB, но нельзя ли сделать что-то вроде

Code:
try{
// попытаться создать текстовый файл
}
catch(...){
//
}


Короче, есть ли в VB аналог try, catch из С++?

#35:  Author: iov PostPosted: Tue Aug 29, 2006 13:48
    —
[quote="Batya"]
Слушай дык таким образом можно из буфера текст любой длины записывать в ion ? Тода можно обойти ограничение на длинну комментария к файлу!
*Batya*
Будет время посмотри плиз, я в скриптах ламер!

#36:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Aug 29, 2006 14:09
    —
fa1con
Поправил скрипт - см. исходный пост.
Теперь ошибку формирую я. Только описание будет такое, какое вернет ОС.

iov wrote:
Слушай дык таким образом можно из буфера текст любой длины записывать в ion ? Тода можно обойти ограничение на длинну комментария к файлу!

Я текст комментария беру не из буфера, а из входного параметра. А длина строки параметров (с учетом раскрутки параметров %L и %P) имеет ограничение 255 символов.
В принципе, ничто не мешает брать из буфера, но этого никто не просил.

#37:  Author: fa1con PostPosted: Tue Aug 29, 2006 14:30
    —
[Feature request] No debug mode Smile

Добавить ещё один параметр. 1/0 – выводить/не выводить ошибки.

#38:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Aug 29, 2006 14:49
    —
fa1con wrote:
[Feature request] No debug mode

Добавить ещё один параметр. 1/0 – выводить/не выводить ошибки.

А смысл? Работа скрипта все равно прерывается. А так я хоть сообщаю, почему.
Если уж тебе не нужны сообщения, закомментарь все MsgBox.

#39: Ну это вот и попросил !!! Если конечно не тудно и время есть Author: iov PostPosted: Wed Aug 30, 2006 09:04
    —
Batya wrote:

Я текст комментария беру не из буфера, а из входного параметра. А длина строки параметров (с учетом раскрутки параметров %L и %P) имеет ограничение 255 символов.
В принципе, ничто не мешает брать из буфера, но этого никто не просил.

Ну это вот и попросил , плиз сильно облегчишь зизнь пользователям! И внесёшь свою лепту в интернет зависимость!! Very Happy
Ну а серьёзно было бы отчень полезно, а то порой комментарий нужен отчень длинный , приходится ручками дописывать!

#40:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Aug 31, 2006 11:45
    —
iov wrote:
Ну это вот и попросил

Исправил скрипт вверху. Для использования необходим ScriptHelper.
Чтобы текст в комментарий попадал из буфера, надо третьим параметром передать пустые кавычки.
Например, параметры для добавления комментария:
%L "%Pdescript.ion" "" 1 3

Кстати, если в тексте в буфере есть переносы строк, я их заменяю на пробелы.

#41: Сенкс начал тестить!!! Author: iov PostPosted: Fri Sep 01, 2006 13:19
    —
Batya wrote:
Ну там много текста я цетировать не буду просто спосибо Batya


Сенкс начал тестить!!!

Первые опыты над подопытным успешны, впечатления положительные. Вера в людей крепнет! Спосибо огромное!

А можно немножко ещё спросить? А что куда надо дописать чтобы
открывалось окошечко для ввода текста и можно было вводить многострочный текст? Такое возможно? Для ситуаций когда не просто добовляешь комментарий а для например дописываешь комментарий для группы файлов уже имеющих комментарий , тогда можно будет выделять разным цветом группы файлов для разных целей...
Это уже многофункциональный скрипт на его основе можно фильтров таких понастроить.... Rolling Eyes

#42:  Author: BatyaLocation: Москва, Россия PostPosted: Mon Sep 18, 2006 13:06
    —
iov wrote:
А что куда надо дописать чтобы открывалось окошечко для ввода текста и можно было вводить многострочный текст?

Многострочный текст вводить нельзя - специфика descript.ion позволяет делать только однострочные комментарии. Сделать же скрипт для работы с files.bbs посложнее.
Если же просто хочется вводить комментарий при каждом запуске скрипта, то можно заменить
Code:
  Dim TCS
  Set TCS   = CreateObject("TCScript.Helper")
  CommLabel = TCS.GetTextFromClip
  Set TCS   = Nothing

на
Code:
  CommLabel = InputBox("Введите комментарий:", "Работа с комментариями", "")

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

#43:  Author: iov PostPosted: Tue Sep 19, 2006 09:09
    —
CommLabel = InputBox("Введите комментарий:", "Работа с комментариями", "") Вот об этом я говорил!!! А если просто убрать все символы перевода строки то тогда вроде должен работать и с многострочным текстом! И окно для ввода многострочного текста! Такое возможно?

#44:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Sep 19, 2006 10:04
    —
iov wrote:
А если просто убрать все символы перевода строки то тогда вроде должен работать и с многострочным текстом!

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

iov wrote:
И окно для ввода многострочного текста! Такое возможно?

Штатными средствами в WindowsHostScript нет возможности создавать окна для ввода многострочного текста.

#45:  Author: iov PostPosted: Tue Sep 19, 2006 10:28
    —
Очень жаль поповоду ввода многострочноо текста Sad Просто камменты порой к файлам по размерам больше самого файла!
А по поводу буфера я Забыл! Идеально... Куда пиво слать? Благодарности нет предела!!! Теперь будем работать по человечески!



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Goto page Previous  1, 2, 3, 4, 5, 6, 7  Next  :| |:
Page 3 of 7

Powered by phpBB © 2001, 2005 phpBB Group