View previous topic :: View next topic |
Author |
Message |
Victor_Dobrov
Joined: 15 Jul 2008 Posts: 50
|
(Separately) Posted: Thu Jul 24, 2008 01:23 Post subject: |
|
|
Batya wrote: | Гораздо проще использовать метод GetExtensionName объекта FileSystemObject. |
Для имени файла к примеру Noname функция FSO.GetExtensionName(File) возвращает имя файла, а нам ведь надо тип! Поэтому я и сделал по-своему. |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Fri Jul 25, 2008 10:32 Post subject: |
|
|
А проверить? Если у файла нет расширения этот метод возвращает пустую строку. Просто выполни вот такой VBS
Code: | MsgBox GetAnExtension("c:\noname")
Function GetAnExtension(DriveSpec)
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
GetAnExtension = fso.GetExtensionName(Drivespec)
End Function | и убедись в этом.
И потому вот такой блок в твоем скрипте будет вполне работоспособен:
Code: | 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
|
|
|
Back to top |
|
|
djalexv
Joined: 28 Oct 2008 Posts: 2
|
(Separately) Posted: Tue Oct 28, 2008 21:07 Post subject: Re: 3-ая редакция |
|
|
Volniy wrote: | Почти то же самое, но только по-человечески
[code]'=========================[ Start of file ]=========================
' File: ReplaceInFiles.vbs
' Description: Производит поиск текста с заменой
' в выделенных текстовых файлах
' Installation: Создайте кнопку на панели TC
' Команда: "диск:\путь\к\файлу\ReplaceInFiles.vbs"
' Параметры: "%L"
' Copyright: (c) 2006-2008, Volniy
...
Изменил немного код, чтобы файлы, в которых разыскиваемая строка отсутствует, не перезаписывались (действительно, нах оно?). |
Возможно у меня все таки проблема с руками но ... в моем случае (*.ini - файлы .. найдены стандартным поиском с поиском текстовой строки.... находятся в разных подпапках одной папки.... ) кроме самой замены удаляет весь текст который находился в файлах с начала и до первой замены |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Thu Oct 30, 2008 01:52 Post subject: Re: 3-ая редакция |
|
|
djalexv wrote: | Возможно у меня все таки проблема с руками |
На счет рук ничего не скажу, а вот с глазами у тебя порядок . Подтверждаю баг (вкрапление в код, результат какого-то моего эсперимента). Извиняюсь, если что ценное покалечил
А устраняется вот такой редакцией строки скрипта:
Code: | Buffer = Replace(CStr(Buffer), Find_String, Replace_String, 1, -1, 1) |
Эти изменения я внес и в исходное сообщение со скриптом. |
|
Back to top |
|
|
djalexv
Joined: 28 Oct 2008 Posts: 2
|
(Separately) Posted: Thu Oct 30, 2008 12:03 Post subject: |
|
|
Благодарю |
|
Back to top |
|
|
aLexx
Joined: 14 Mar 2005 Posts: 442 Location: Новокузнецк
|
(Separately) Posted: Thu Nov 27, 2008 14:41 Post subject: |
|
|
Code: | ' 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 метров.
Как это победить? |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Thu Nov 27, 2008 18:24 Post subject: |
|
|
aLexx wrote: | Как это победить? |
Можно получать список файлов не через буфер, а пердавать через параметр %L. _________________ Нет, я не сплю. Я просто медленно моргаю. |
|
Back to top |
|
|
aLexx
Joined: 14 Mar 2005 Posts: 442 Location: Новокузнецк
|
(Separately) Posted: Thu Nov 27, 2008 18:38 Post subject: |
|
|
Я про это думал... Но не придумал, как!
Опыта маловато... |
|
Back to top |
|
|
Riemann
Joined: 24 Sep 2008 Posts: 23
|
(Separately) Posted: Sat Jan 31, 2009 16:14 Post subject: |
|
|
Volniy
Так как постоянно работаю с тоталом в висте, имею ряд ограничений связанных с неработоспособностью скриптов основанных на TCWSHelp.exe Вроде промелькало где то сообщение о баге, но про работоспособность не отписалось. Сделав свою сборку, навесив нужные кнопки раздал её пользователям XP и надеюсь када нить решить с вистой проблему. |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Sat Jan 31, 2009 21:00 Post subject: |
|
|
А по-конкретней нельзя ли? Что за "ряд ограничений"? Может просто влом vb5 рантаймы поставить? Могу на VB6 перекомпилировать (если исходник найду, конечно). |
|
Back to top |
|
|
Riemann
Joined: 24 Sep 2008 Posts: 23
|
(Separately) Posted: Thu Feb 05, 2009 00:56 Post subject: |
|
|
Вот конкретнее
Предполагаю, что на винде 7-ке аналогичная проблема. |
|
Back to top |
|
|
Volniy
Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Thu Feb 05, 2009 02:39 Post subject: |
|
|
А регистрация хелпера проходит без ошибок? Я имею ввиду запуск экзешника TCWSHelp.exe. |
|
Back to top |
|
|
Riemann
Joined: 24 Sep 2008 Posts: 23
|
(Separately) Posted: Thu Feb 05, 2009 11:34 Post subject: |
|
|
Регистрация проходит без ошибок, внесение без проблем. А эффекта нет. |
|
Back to top |
|
|
Parcan
Joined: 15 Dec 2004 Posts: 398 Location: Russian
|
(Separately) Posted: Tue May 12, 2009 17:20 Post subject: |
|
|
А можно ли в скрипте узнать не запущен ли он уже?
Чтобы если скрипт запустить 2 раза один выполнялся а второй чухал это и закрывался бы. |
|
Back to top |
|
|
Batya
Joined: 15 Dec 2004 Posts: 2218 Location: Москва, Россия
|
(Separately) Posted: Wed May 13, 2009 17:20 Post subject: |
|
|
Parcan wrote: | А можно ли в скрипте узнать не запущен ли он уже?
Чтобы если скрипт запустить 2 раза один выполнялся а второй чухал это и закрывался бы. |
Code: | 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
|
_________________ Нет, я не сплю. Я просто медленно моргаю. |
|
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
|