Страница 9 из 27
Добавлено: Чт июл 24, 2008 01:23
Victor_Dobrov
Batya писал(а):Гораздо проще использовать метод GetExtensionName объекта FileSystemObject.
Для имени файла к примеру Noname функция FSO.GetExtensionName(File) возвращает имя файла, а нам ведь надо тип! Поэтому я и сделал по-своему.
Добавлено: Пт июл 25, 2008 10:32
Volniy
А проверить? Если у файла нет расширения этот метод
возвращает пустую строку. Просто выполни вот такой VBS
Код: Выделить всё
MsgBox GetAnExtension("c:\noname")
Function GetAnExtension(DriveSpec)
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
GetAnExtension = fso.GetExtensionName(Drivespec)
End Function
и убедись в этом.
И потому вот такой блок в твоем скрипте будет вполне работоспособен:
Код: Выделить всё
If WScript.Arguments.Count > 0 Then 'запуск без параметров переключает последний фильтр
sFilter = WScript.Arguments(0)
Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FileExists(sFilter) Then sFilter = "*." & FSO.GetExtensionName(sFilter)
TCS.INIWrite WScript.ScriptFullName, "sFilter", "sFilter", Chr(34) & sFilter & Chr(34) 'запомнить фильтр
End If
Re: 3-ая редакция
Добавлено: Вт окт 28, 2008 20:07
djalexv
Volniy писал(а):Почти то же самое, но только по-человечески
Код: Выделить всё
'=========================[ Start of file ]=========================
' File: ReplaceInFiles.vbs
' Description: Производит поиск текста с заменой
' в выделенных текстовых файлах
' Installation: Создайте кнопку на панели TC
' Команда: "диск:\путь\к\файлу\ReplaceInFiles.vbs"
' Параметры: "%L"
' Copyright: (c) 2006-2008, Volniy
...
Изменил немного код, чтобы файлы, в которых разыскиваемая строка [b]отсутствует[/b], не перезаписывались (действительно, нах оно?).[/quote]
Возможно у меня все таки проблема с руками но ... в моем случае (*.ini - файлы .. найдены стандартным поиском с поиском текстовой строки.... находятся в разных подпапках одной папки.... ) кроме самой замены удаляет весь текст который находился в файлах с начала и до первой замены :cry:
Re: 3-ая редакция
Добавлено: Чт окт 30, 2008 00:52
Volniy
djalexv писал(а):Возможно у меня все таки проблема с руками
На счет рук ничего не скажу, а вот с глазами у тебя порядок

. Подтверждаю баг (вкрапление в код, результат какого-то моего эсперимента). Извиняюсь, если что ценное покалечил
А устраняется вот такой редакцией строки скрипта:
Код: Выделить всё
Buffer = Replace(CStr(Buffer), Find_String, Replace_String, 1, -1, 1)
Эти изменения я внес и в исходное сообщение со скриптом.
Добавлено: Чт окт 30, 2008 11:03
djalexv
Благодарю

Добавлено: Чт ноя 27, 2008 13:41
aLexx
Код: Выделить всё
' File: ZebraMark-2.vbs
' Description: Помечает все файлы и каталоги через один.
' Requirements: WSH Helper for TC by Volniy
' Copyright: (c) 2007, Volniy, aLexx
Option Explicit
Dim List, TCS, Cnt, Buf
Set TCS = CreateObject("TCScript.Helper")
TCS.SendCommand ("cm_SelectAll") 'Выбрать всё
TCS.SendCommand ("cm_CopyFullNamesToClip") 'Копируем в буфер
List = Split(TCS.GetTextFromClip,vbNewLine) ' Получаем массив имен
If UBound(List) > 2 Then
For Cnt=0 To UBound(List)
If Cnt Mod 2 = 1 Then
Buf = Buf & List(Cnt) & vbNewLine
End If
Next
TCS.SetTextToClip CStr(Buf)
TCS.SendCommand "cm_LoadSelectionFromClip", True
MsgBox "Выделено ""зеброй"":): " & Cnt \ 2 & " файлов и каталогов.", vbInformation, "Завершено!"
Else
TCS.SendCommand ("cm_ClearAll") 'Снять выделение
End If
Set TCS = Nothing
Set List = Nothing
Set Cnt = Nothing
Set Buf = Nothing
WScript.Quit
Очень активно используемый мной скрипт. Чуть переделанный скрипт от Volniy. Для удаления
дубликатов, одинаковых файлов. Но периодически, раз 5 из 100, скрипт не отрабатывает.
Пишет "Выделено "зеброй":): 0 файлов и каталогов.", хотя файлов море! Пришлось для обхода
этой ситуации ввести If...Else.
Выяснилось, что в этих случаях UBound(List) равен -1. Т.е., не отрабатывает строка
List = Split(... и т.д. А не отрабатывает потому, что не выполняется команда
"cm_CopyFullNamesToClip", т.е. буфер обмена пустой.
Может, это зависит от размера получаемого списка файлов? И "cm_CopyFullNamesToClip"
выполняется слишком долго? Или есть какой-то лимит на этот размер?
Иногда у меня этот список получается до 20 тыщ файлов! В тексте это более 3 метров.
Как это победить?
Добавлено: Чт ноя 27, 2008 17:24
Batya
aLexx писал(а):Как это победить?
Можно получать список файлов не через буфер, а пердавать через параметр %L.
Добавлено: Чт ноя 27, 2008 17:38
aLexx
Я про это думал... Но не придумал, как!
Опыта маловато...
Добавлено: Сб янв 31, 2009 15:14
Riemann
Volniy
Так как постоянно работаю с тоталом в висте, имею ряд ограничений связанных с неработоспособностью скриптов основанных на TCWSHelp.exe Вроде промелькало где то сообщение о баге, но про работоспособность не отписалось. Сделав свою сборку, навесив нужные кнопки раздал её пользователям XP и надеюсь када нить решить с вистой проблему.
Добавлено: Сб янв 31, 2009 20:00
Volniy
А по-конкретней нельзя ли? Что за "ряд ограничений"? Может просто влом vb5 рантаймы поставить? Могу на VB6 перекомпилировать (если исходник найду, конечно).
Добавлено: Ср фев 04, 2009 23:56
Riemann
Вот конкретнее
Предполагаю, что на винде 7-ке аналогичная проблема.
Добавлено: Чт фев 05, 2009 01:39
Volniy
А регистрация хелпера проходит без ошибок? Я имею ввиду запуск экзешника TCWSHelp.exe.
Добавлено: Чт фев 05, 2009 10:34
Riemann
Регистрация проходит без ошибок, внесение без проблем. А эффекта нет.
Добавлено: Вт май 12, 2009 17:20
Parcan
А можно ли в скрипте узнать не запущен ли он уже?
Чтобы если скрипт запустить 2 раза один выполнялся а второй чухал это и закрывался бы.
Добавлено: Ср май 13, 2009 17:20
Batya
Parcan писал(а):А можно ли в скрипте узнать не запущен ли он уже?
Чтобы если скрипт запустить 2 раза один выполнялся а второй чухал это и закрывался бы.
Код: Выделить всё
Option Explicit
Dim WMI, ComLine, oProc, oP, Btn, i, ProcCount
On Error Resume Next
'Объявляем объект WMI
Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\CIMV2")
If Err.Number <> 0 Then
MsgBox Err.Number & ": " & Err.Description
WScript.Quit
End If
'В командной строке должно быть по 2 слэша, например, C:\\Путь\\до\\файла\\Файл.Расширение
ComLine = Replace(WScript.ScriptFullName, "", "\")
'Ищем в списке процессов по командной строке, не запущен ли уже данный скрипт
Set oProc = WMI.ExecQuery("SELECT * from Win32_Process " &_
"WHERE CommandLine Like '%wscript%" & ComLine & "%'")
ProcCount = oProc.Count
'Если процессов более одного (с учетом текущего запуска)
If ProcCount > 1 Then
'Выдаем предупреждение с предложением завершить работу старого скрипта
Btn = MsgBox("Обнаружен ранее запущенный аналогичный скрипт." &_
vbNewLine & "Старый процесс будет замещен новым." &_
vbNewLine, _
vbOKCancel + vbQuestion, "Перезапуск скрипта")
'Если отвечаем "OK"
If Btn = vbOK Then
i = 0
'Убиваем все аналогичные процессы, кроме текущего (он последний)
For Each oP In oProc
i = i + 1
If i = ProcCount Then
Exit For
End If
oP.Delete_
Next
Else
Set oProc = Nothing
Set WMI = Nothing
WScript.Quit
End If
End If
On Error Goto 0