View previous topic :: View next topic |
Author |
Message |
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Mon Aug 28, 2006 16:24 Post subject: |
|
|
Постарался сделать универсальный вариант. Теперь скрипт один, и режим его работы зависит от переданных параметров.
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 |
|
|
fa1con
Joined: 19 Aug 2006 Posts: 162
|
(Separately) Posted: Mon Aug 28, 2006 22:00 Post subject: |
|
|
Работает. Но ещё надо проверять descript.ion на возможность записи. А то неприятная ошибка выскакивает. Ещё вылазит «path not found» если попытаться пометить что-то в папке My Computer, например. Но это из той же оперы вроде. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Tue Aug 29, 2006 09:32 Post subject: |
|
|
fa1con
Давай подробней. Каким образом "неприятная ошибка выскакивает"?
My Computer это виртуальная папка? Если это так, то это не ко мне, а к Гислеру - сколько раз уж говорилось, что работа в TC с такими папками организована крайне плохо. Если же это не виртуальная папка, то как повторить ошибку? На какой именно строке ругается? _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
fa1con
Joined: 19 Aug 2006 Posts: 162
|
(Separately) Posted: Tue Aug 29, 2006 13:28 Post subject: |
|
|
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 |
|
|
iov
Joined: 17 Mar 2005 Posts: 51
|
(Separately) Posted: Tue Aug 29, 2006 13:48 Post subject: |
|
|
[quote="Batya"]
Слушай дык таким образом можно из буфера текст любой длины записывать в ion ? Тода можно обойти ограничение на длинну комментария к файлу!
*Batya*
Будет время посмотри плиз, я в скриптах ламер! |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Tue Aug 29, 2006 14:09 Post subject: |
|
|
fa1con
Поправил скрипт - см. исходный пост.
Теперь ошибку формирую я. Только описание будет такое, какое вернет ОС.
iov wrote: | Слушай дык таким образом можно из буфера текст любой длины записывать в ion ? Тода можно обойти ограничение на длинну комментария к файлу! |
Я текст комментария беру не из буфера, а из входного параметра. А длина строки параметров (с учетом раскрутки параметров %L и %P) имеет ограничение 255 символов.
В принципе, ничто не мешает брать из буфера, но этого никто не просил. |
|
Back to top |
|
|
fa1con
Joined: 19 Aug 2006 Posts: 162
|
(Separately) Posted: Tue Aug 29, 2006 14:30 Post subject: |
|
|
[Feature request] No debug mode
Добавить ещё один параметр. 1/0 – выводить/не выводить ошибки. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Tue Aug 29, 2006 14:49 Post subject: |
|
|
fa1con wrote: | [Feature request] No debug mode
Добавить ещё один параметр. 1/0 – выводить/не выводить ошибки. |
А смысл? Работа скрипта все равно прерывается. А так я хоть сообщаю, почему.
Если уж тебе не нужны сообщения, закомментарь все MsgBox. |
|
Back to top |
|
|
iov
Joined: 17 Mar 2005 Posts: 51
|
(Separately) Posted: Wed Aug 30, 2006 09:04 Post subject: Ну это вот и попросил !!! Если конечно не тудно и время есть |
|
|
Batya wrote: |
Я текст комментария беру не из буфера, а из входного параметра. А длина строки параметров (с учетом раскрутки параметров %L и %P) имеет ограничение 255 символов.
В принципе, ничто не мешает брать из буфера, но этого никто не просил. |
Ну это вот и попросил , плиз сильно облегчишь зизнь пользователям! И внесёшь свою лепту в интернет зависимость!!
Ну а серьёзно было бы отчень полезно, а то порой комментарий нужен отчень длинный , приходится ручками дописывать! |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Thu Aug 31, 2006 11:45 Post subject: |
|
|
iov wrote: | Ну это вот и попросил |
Исправил скрипт вверху. Для использования необходим ScriptHelper.
Чтобы текст в комментарий попадал из буфера, надо третьим параметром передать пустые кавычки.
Например, параметры для добавления комментария:
%L "%Pdescript.ion" "" 1 3
Кстати, если в тексте в буфере есть переносы строк, я их заменяю на пробелы. |
|
Back to top |
|
|
iov
Joined: 17 Mar 2005 Posts: 51
|
(Separately) Posted: Fri Sep 01, 2006 13:19 Post subject: Сенкс начал тестить!!! |
|
|
Batya wrote: | Ну там много текста я цетировать не буду просто спосибо Batya |
Сенкс начал тестить!!!
Первые опыты над подопытным успешны, впечатления положительные. Вера в людей крепнет! Спосибо огромное!
А можно немножко ещё спросить? А что куда надо дописать чтобы
открывалось окошечко для ввода текста и можно было вводить многострочный текст? Такое возможно? Для ситуаций когда не просто добовляешь комментарий а для например дописываешь комментарий для группы файлов уже имеющих комментарий , тогда можно будет выделять разным цветом группы файлов для разных целей...
Это уже многофункциональный скрипт на его основе можно фильтров таких понастроить.... |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Mon Sep 18, 2006 13:06 Post subject: |
|
|
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 |
|
|
iov
Joined: 17 Mar 2005 Posts: 51
|
(Separately) Posted: Tue Sep 19, 2006 09:09 Post subject: |
|
|
CommLabel = InputBox("Введите комментарий:", "Работа с комментариями", "") Вот об этом я говорил!!! А если просто убрать все символы перевода строки то тогда вроде должен работать и с многострочным текстом! И окно для ввода многострочного текста! Такое возможно? _________________ Все мы смертны... Но если нарываться то могут укоротить жизнь... |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Tue Sep 19, 2006 10:04 Post subject: |
|
|
iov wrote: | А если просто убрать все символы перевода строки то тогда вроде должен работать и с многострочным текстом! |
Сейчас и так все символы перевода строки заменяются на пробелы - актуально, если брать комментарий из буфера.
iov wrote: | И окно для ввода многострочного текста! Такое возможно? |
Штатными средствами в WindowsHostScript нет возможности создавать окна для ввода многострочного текста. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
iov
Joined: 17 Mar 2005 Posts: 51
|
(Separately) Posted: Tue Sep 19, 2006 10:28 Post subject: |
|
|
Очень жаль поповоду ввода многострочноо текста Просто камменты порой к файлам по размерам больше самого файла!
А по поводу буфера я Забыл! Идеально... Куда пиво слать? Благодарности нет предела!!! Теперь будем работать по человечески! _________________ Все мы смертны... Но если нарываться то могут укоротить жизнь... |
|
Back to top |
|
|
|
|
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
|