Windows Script Host

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер

Victor_Dobrov
Сообщения: 50
Зарегистрирован: Вт июл 15, 2008 19:21

Сообщение Victor_Dobrov »

Batya писал(а):Гораздо проще использовать метод GetExtensionName объекта FileSystemObject.
Для имени файла к примеру Noname функция FSO.GetExtensionName(File) возвращает имя файла, а нам ведь надо тип! Поэтому я и сделал по-своему.
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение 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 
djalexv
Сообщения: 2
Зарегистрирован: Вт окт 28, 2008 19:12

Re: 3-ая редакция

Сообщение djalexv »

Volniy писал(а):Почти то же самое, но только по-человечески :wink:

Код: Выделить всё

'=========================[ Start of file ]========================= 
'  File:         ReplaceInFiles.vbs 
'  Description:  Производит поиск текста с заменой 
'                в выделенных текстовых файлах      
'  Installation: Создайте кнопку на панели TC 
'                Команда: "диск:\путь\к\файлу\ReplaceInFiles.vbs" 
'                Параметры: "%L" 
'  Copyright:    (c) 2006-2008, Volniy 
...
Изменил немного код, чтобы файлы, в которых разыскиваемая строка [b]отсутствует[/b], не перезаписывались (действительно, нах оно?).[/quote]

Возможно у меня все таки проблема с руками но ... в моем случае  (*.ini - файлы .. найдены стандартным поиском с поиском текстовой строки.... находятся в разных подпапках одной папки....  )  кроме самой замены удаляет весь текст который находился в файлах с начала и до первой замены  :cry:
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Re: 3-ая редакция

Сообщение Volniy »

djalexv писал(а):Возможно у меня все таки проблема с руками
На счет рук ничего не скажу, а вот с глазами у тебя порядок :wink: . Подтверждаю баг (вкрапление в код, результат какого-то моего эсперимента). Извиняюсь, если что ценное покалечил :oops:
А устраняется вот такой редакцией строки скрипта:

Код: Выделить всё

Buffer = Replace(CStr(Buffer), Find_String, Replace_String, 1, -1, 1)
Эти изменения я внес и в исходное сообщение со скриптом.
djalexv
Сообщения: 2
Зарегистрирован: Вт окт 28, 2008 19:12

Сообщение djalexv »

Благодарю :D
Аватара пользователя
aLexx
Сообщения: 442
Зарегистрирован: Пн мар 14, 2005 08:33
Откуда: Новокузнецк
Контактная информация:

Сообщение 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 метров.
Как это победить?
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

aLexx писал(а):Как это победить?
Можно получать список файлов не через буфер, а пердавать через параметр %L.
Нет, я не сплю. Я просто медленно моргаю.
Аватара пользователя
aLexx
Сообщения: 442
Зарегистрирован: Пн мар 14, 2005 08:33
Откуда: Новокузнецк
Контактная информация:

Сообщение aLexx »

Я про это думал... Но не придумал, как!
Опыта маловато...
Riemann
Сообщения: 23
Зарегистрирован: Ср сен 24, 2008 14:56

Сообщение Riemann »

Volniy
Так как постоянно работаю с тоталом в висте, имею ряд ограничений связанных с неработоспособностью скриптов основанных на TCWSHelp.exe Вроде промелькало где то сообщение о баге, но про работоспособность не отписалось. Сделав свою сборку, навесив нужные кнопки раздал её пользователям XP и надеюсь када нить решить с вистой проблему.
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

А по-конкретней нельзя ли? Что за "ряд ограничений"? Может просто влом vb5 рантаймы поставить? Могу на VB6 перекомпилировать (если исходник найду, конечно).
Riemann
Сообщения: 23
Зарегистрирован: Ср сен 24, 2008 14:56

Сообщение Riemann »

Вот конкретнее
Изображение

Предполагаю, что на винде 7-ке аналогичная проблема.
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

А регистрация хелпера проходит без ошибок? Я имею ввиду запуск экзешника TCWSHelp.exe.
Riemann
Сообщения: 23
Зарегистрирован: Ср сен 24, 2008 14:56

Сообщение Riemann »

Регистрация проходит без ошибок, внесение без проблем. А эффекта нет.
Аватара пользователя
Parcan
Сообщения: 399
Зарегистрирован: Ср дек 15, 2004 16:39
Откуда: Russian

Сообщение Parcan »

А можно ли в скрипте узнать не запущен ли он уже?
Чтобы если скрипт запустить 2 раза один выполнялся а второй чухал это и закрывался бы.
Аватара пользователя
Batya
Сообщения: 2236
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение 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
Нет, я не сплю. Я просто медленно моргаю.
Ответить