Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Пометить файл/папку
Goto page Previous  1, 2, 3, 4, 5, 6, 7  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
Batya



Joined: 15 Dec 2004
Posts: 2200
Location: Москва, Россия

Post (Separately) Posted: Mon Aug 28, 2006 16:24    Post subject: Reply with quote

Постарался сделать универсальный вариант. Теперь скрипт один, и режим его работы зависит от переданных параметров.
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
Back to top
View user's profile Send private message
fa1con



Joined: 19 Aug 2006
Posts: 162

Post (Separately) Posted: Mon Aug 28, 2006 22:00    Post subject: Reply with quote

Работает. Но ещё надо проверять descript.ion на возможность записи. А то неприятная ошибка выскакивает. Ещё вылазит «path not found» если попытаться пометить что-то в папке My Computer, например. Но это из той же оперы вроде.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2200
Location: Москва, Россия

Post (Separately) Posted: Tue Aug 29, 2006 09:32    Post subject: Reply with quote

fa1con
Давай подробней. Каким образом "неприятная ошибка выскакивает"?
My Computer это виртуальная папка? Если это так, то это не ко мне, а к Гислеру - сколько раз уж говорилось, что работа в TC с такими папками организована крайне плохо. Если же это не виртуальная папка, то как повторить ошибку? На какой именно строке ругается?
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
fa1con



Joined: 19 Aug 2006
Posts: 162

Post (Separately) Posted: Tue Aug 29, 2006 13:28    Post subject: Reply with quote

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 из С++?
Back to top
View user's profile Send private message
iov



Joined: 17 Mar 2005
Posts: 51

Post (Separately) Posted: Tue Aug 29, 2006 13:48    Post subject: Reply with quote

[quote="Batya"]
Слушай дык таким образом можно из буфера текст любой длины записывать в ion ? Тода можно обойти ограничение на длинну комментария к файлу!
*Batya*
Будет время посмотри плиз, я в скриптах ламер!
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2200
Location: Москва, Россия

Post (Separately) Posted: Tue Aug 29, 2006 14:09    Post subject: Reply with quote

fa1con
Поправил скрипт - см. исходный пост.
Теперь ошибку формирую я. Только описание будет такое, какое вернет ОС.

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

Я текст комментария беру не из буфера, а из входного параметра. А длина строки параметров (с учетом раскрутки параметров %L и %P) имеет ограничение 255 символов.
В принципе, ничто не мешает брать из буфера, но этого никто не просил.
Back to top
View user's profile Send private message
fa1con



Joined: 19 Aug 2006
Posts: 162

Post (Separately) Posted: Tue Aug 29, 2006 14:30    Post subject: Reply with quote

[Feature request] No debug mode Smile

Добавить ещё один параметр. 1/0 – выводить/не выводить ошибки.
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2200
Location: Москва, Россия

Post (Separately) Posted: Tue Aug 29, 2006 14:49    Post subject: Reply with quote

fa1con wrote:
[Feature request] No debug mode

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

А смысл? Работа скрипта все равно прерывается. А так я хоть сообщаю, почему.
Если уж тебе не нужны сообщения, закомментарь все MsgBox.
Back to top
View user's profile Send private message
iov



Joined: 17 Mar 2005
Posts: 51

Post (Separately) Posted: Wed Aug 30, 2006 09:04    Post subject: Ну это вот и попросил !!! Если конечно не тудно и время есть Reply with quote

Batya wrote:

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

Ну это вот и попросил , плиз сильно облегчишь зизнь пользователям! И внесёшь свою лепту в интернет зависимость!! Very Happy
Ну а серьёзно было бы отчень полезно, а то порой комментарий нужен отчень длинный , приходится ручками дописывать!
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2200
Location: Москва, Россия

Post (Separately) Posted: Thu Aug 31, 2006 11:45    Post subject: Reply with quote

iov wrote:
Ну это вот и попросил

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

Кстати, если в тексте в буфере есть переносы строк, я их заменяю на пробелы.
Back to top
View user's profile Send private message
iov



Joined: 17 Mar 2005
Posts: 51

Post (Separately) Posted: Fri Sep 01, 2006 13:19    Post subject: Сенкс начал тестить!!! Reply with quote

Batya wrote:
Ну там много текста я цетировать не буду просто спосибо Batya


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

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

А можно немножко ещё спросить? А что куда надо дописать чтобы
открывалось окошечко для ввода текста и можно было вводить многострочный текст? Такое возможно? Для ситуаций когда не просто добовляешь комментарий а для например дописываешь комментарий для группы файлов уже имеющих комментарий , тогда можно будет выделять разным цветом группы файлов для разных целей...
Это уже многофункциональный скрипт на его основе можно фильтров таких понастроить.... Rolling Eyes
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2200
Location: Москва, Россия

Post (Separately) Posted: Mon Sep 18, 2006 13:06    Post subject: Reply with quote

iov wrote:
А что куда надо дописать чтобы открывалось окошечко для ввода текста и можно было вводить многострочный текст?

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

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

Соответственно, при запуске скрипта надо третьим параметром передать пустые кавычки.
Т.е. если комментарий не указан явно, он будет браться не из буфера обмена, а будет предложено ввести его.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
iov



Joined: 17 Mar 2005
Posts: 51

Post (Separately) Posted: Tue Sep 19, 2006 09:09    Post subject: Reply with quote

CommLabel = InputBox("Введите комментарий:", "Работа с комментариями", "") Вот об этом я говорил!!! А если просто убрать все символы перевода строки то тогда вроде должен работать и с многострочным текстом! И окно для ввода многострочного текста! Такое возможно?
_________________
Все мы смертны... Но если нарываться то могут укоротить жизнь...
Back to top
View user's profile Send private message
Batya



Joined: 15 Dec 2004
Posts: 2200
Location: Москва, Россия

Post (Separately) Posted: Tue Sep 19, 2006 10:04    Post subject: Reply with quote

iov wrote:
А если просто убрать все символы перевода строки то тогда вроде должен работать и с многострочным текстом!

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

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

Штатными средствами в WindowsHostScript нет возможности создавать окна для ввода многострочного текста.
_________________
Нет, я не сплю. Я просто медленно моргаю.
Back to top
View user's profile Send private message
iov



Joined: 17 Mar 2005
Posts: 51

Post (Separately) Posted: Tue Sep 19, 2006 10:28    Post subject: Reply with quote

Очень жаль поповоду ввода многострочноо текста Sad Просто камменты порой к файлам по размерам больше самого файла!
А по поводу буфера я Забыл! Идеально... Куда пиво слать? Благодарности нет предела!!! Теперь будем работать по человечески!
_________________
Все мы смертны... Но если нарываться то могут укоротить жизнь...
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page Previous  1, 2, 3, 4, 5, 6, 7  Next
Page 3 of 7

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group