Windows Script Host
Select messages from
# through # FAQ
[/[Print]\]

Total Commander -> Автоматизация Total Commander

#1: Windows Script Host Author: BatyaLocation: Москва, Россия PostPosted: Fri Nov 18, 2005 14:49
    —
Хочеться начать тему для обмена опытом написания скриптов на Windows Script Host.
В который раз обращаюсь к Volniy - сделай, наконец, релиз своего TCWSHelp и выложи его на wincmd.ru! Это же супер продукт!

Помимо воззваний прошу совета.
Ситуация - запущен скрипт, который постоянно висит в памяти, для сканирования некоторого состояния в папке на диске. Как запуском другого скрипта корретно завершить работу первого?
В первом скрипте организован цикл
Code:
Do While MyKey
  ...
Loop

MyKey в цикле не меняется.
Как вторым скриптом заставить штатно выйти из цикла, а не убивать процесс?

#2:  Author: Lev PostPosted: Fri Nov 18, 2005 15:06
    —
Я бы просто читал MyKey или какое-другое условие прямо с диска или другого заведенного места. MyKey можно записать и вручную и скриптом
Code:
Do While MyKey
  ...
прочитать MyKey из файла
Loop

---
а насчет TCHelper'a - не ждать релиза, а в принудительном порядке завести страничку под него на сайте, выложить туда очередную бету и отдать пароль от странички Volniy, тем более, что сама бета там и так лежит.

#3:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Nov 18, 2005 15:16
    —
Lev
Quote:
прочитать MyKey из файла

ОК. Только это наверное не самое оптимальное решение с точки зрения ресурсозатрат (накладно каждый раз читать файл)?
Можно, конечно, еще в реестр писать. Но тоже не очень мне нравится - плодить лишний мусор.
У кого-нибудь еще есть идеи?

#4:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Nov 18, 2005 15:19
    —
Quote:
а насчет TCHelper'a - не ждать релиза, а в принудительном порядке завести страничку под него на сайте, выложить туда очередную бету и отдать пароль от странички Volniy, тем более, что сама бета там и так лежит.

Volniy
Неужели действительно придеться так сделать? Wink

#5:  Author: Lev PostPosted: Fri Nov 18, 2005 15:42
    —
Можно по-реже читать

Code:
Do While MyKey
counter=counter+1
  ...
if counter=мульён then
counter=0
прочитать MyKey из отведенного места
end if
Loop

#6:  Author: GeNtlELocation: Россия, Чита PostPosted: Fri Nov 18, 2005 16:23
    —
А можно создать файл в памяти и читать MyKey оттуда?

#7:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Nov 18, 2005 16:53
    —
GeNtlE
Quote:
создать файл в памяти

Это как?

#8:  Author: GeNtlELocation: Россия, Чита PostPosted: Fri Nov 18, 2005 18:37
    —
Если бы я знал, как это делается скриптами - не стал бы спрашивать, но если существует возможность использования WinAPI'шных функций из скриптов, то, я думаю, это возможно...
Вот, например, у нас есть CreateFileMapping... И есть вот MSDN'а кусок.
С этим можно что-нибудь сделать? На обычных языках - реализуемо. На скриптах - не знаю,.. но хочу разобраться - Интересно.

#9:  Author: VolniyLocation: Местный PostPosted: Fri Nov 18, 2005 21:03
    —
Quote:
Volniy
Неужели действительно придеться так сделать? Wink

Ну что ж это такое, в самом-то деле Sad. На старом форуме SAM "меня без меня женил", а сча и вы туда же, блин.
У меня есть (был, по крайней мере, может уже и не пашет) свой аккаунт, мне SAM его выбил когда-то. Если хоть с десяток человек считает, что есть смысл выкладывать - я выложу. Насчет дальнейшей поддержки - фиг его знает, уж как получится., не могу гарантировать, что уделю этому проекту много времени.

ЗЫ А 10-ую бетку я уже где-нибудь тут светил?

==

Пардон, забыл я по теме высказаться. imho реестр вполне подойдет для обмена информацией между скриптами, чтение и запись в него это фактически чтение из/в память. Тоесть это будет очень быстро. А чтобы не грузить бесконечным циклом проц, надо поставить в цикле задержку между проверками
Code:
WScript.Sleep 200

Есть одна проблема: при ошибке работы скрипта в Реестре может остаться значение и оно будет мешать дальнейшей работе скриптов. Тоесть наадо не забыть это значение инициализировать/удалить.

#10:  Author: Lev PostPosted: Sat Nov 19, 2005 00:27
    —
Quote:
Если хоть с десяток человек считает, что есть смысл выкладывать - я выложу
первый нах Smile выкладывай
Даже если сам TCHelper заморожен, то как появится страничка, так пойдет новая волна обсуждений, пойдут новые скрипты. Буржуи тоже скриптов подкинут. В общем, всем польза будет.
А какие предубеждения против выкладывания?
Quote:
А 10-ую бетку я уже где-нибудь тут светил?
Не видел, ждём-с

#11:  Author: _ElzorLocation: Орск PostPosted: Sat Nov 19, 2005 00:38
    —
Второй.
Скрипты сам использую редко, но иногда хочется что-нибуть интегрить в TC...

#12:  Author: VolniyLocation: Местный PostPosted: Sat Nov 19, 2005 01:46
    —
Lev wrote:
А какие предубеждения против выкладывания?

Да сами знаете, сколько всякого сомнительного там выкладывается. Так еще и мою недоделанную штуковину туда? Опять-же, про буржуев, им же надо на Английском доку написать, а это как-никак не "My name is Nick. I am eleven years old etc". Хотя, может и обойдутся они без доки Smile

==

Бессоница, конечно, вещь паршивая, но иногда имеет и положительный побочный эффект. Взял вот, да и выложил десятую бетку на wincmd.ru.

#13:  Author: BatyaLocation: Москва, Россия PostPosted: Mon Nov 21, 2005 10:48
    —
Урааа!!!
Это случилось!
Я думаю, понятно, что мой голос также можно приплюсовать Smile

==
ОК. Значит буду реестр читать/писать.
А насчет Sleep - это понятно. У меня изначально это было. Просто это не относится к моему вопросу, поэтому не писал.

==
Volniy
Еще раз спасибо за Helper!

#14:  Author: BatyaLocation: Москва, Россия PostPosted: Mon Nov 21, 2005 13:08
    —
Volniy
А в какой ветке реестра корректней создать параметр? (Не хочеться создавать где попало.)

#15:  Author: VolniyLocation: Местный PostPosted: Mon Nov 21, 2005 13:51
    —
Batya wrote:
Volniy
А в какой ветке реестра корректней создать параметр? (Не хочеться создавать где попало.)

Я думаю, что это без разницы. Ну вот хотя бы и в HKEY_CURRENT_USER\Software\Microsoft\Windows Scripting Host\Settings. Только имя параметру оригинальное придумай на всякий случай Wink

#16:  Author: vserd PostPosted: Tue Nov 22, 2005 13:16
    —
Batya
Quote:
А в какой ветке реестра корректней создать параметр? (Не хочеться создавать где попало.)

в HKEY_CURRENT_USER\Software\Batya software\....
Создавай именно в HKEY_CURRENT_USER т.к. на HKLM нет прав если пользуются не под админом.

#17:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Nov 22, 2005 13:54
    —
Volniy, vserd
ОК. Решил создать в HKCU\Environment\.

#18:  Author: VolniyLocation: Местный PostPosted: Tue Nov 22, 2005 15:23
    —
Batya wrote:
Volniy, vserd
ОК. Решил создать в HKCU\Environment\.

Я думаю, что не стоит вмешиваться в системные настройки.
Quote:
You can modify user environment variables by editing the following Registry key: HKEY_CURRENT_USER\Environment
(Value entries that correspond to the current user's settings for environment variables. This includes information that was stored in the AUTOEXEC.BAT file under MS-DOS. Values should be set by using the System icon in Control Panel. )


Может лучше выберешь что-нибудь по-нейтральнее?

А вообще объяснил бы ты по-точнее свою идею со взаимодействием скриптов. Может там вообще по-другому пути можно пойти. Почему один скрипт должен прерывать другой, почему сам скрипт не может разобраться когда ему закончиться?

#19:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Nov 22, 2005 15:45
    —
Volniy
Quote:
А вообще объяснил бы ты по-точнее свою идею со взаимодействием скриптов. Может там вообще по-другому пути можно пойти. Почему один скрипт должен прерывать другой, почему сам скрипт не может разобраться когда ему закончиться?

Писал скрипт в теме - Добавление имя каталога к именам выделенных файлов?.
Нужно, чтобы скрипт постоянно висел в памяти. Но ведь "не есть хорошо" просто убивать процесс, если надо прервать работу скрипта. Хочеться сделать все цивильно. Поэтому и задался вопросом - "Как вторым скриптом убить работу первого?".

#20:  Author: VolniyLocation: Местный PostPosted: Tue Nov 22, 2005 19:31
    —
Batya wrote:
Писал скрипт в теме - Добавление имя каталога к именам выделенных файлов?.

Посмотрел. Ну ты и завернул там, однако... Я вот что тебе скажу: ты зря отказался от пива Smile, оно того стоило. Это не скрипт, а целая прога, серьезно.

#21:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Nov 23, 2005 12:11
    —
Volniy
Quote:
Посмотрел. Ну ты и завернул там, однако... Я вот что тебе скажу: ты зря отказался от пива , оно того стоило. Это не скрипт, а целая прога, серьезно.

Да ладно, всего-то несколько десятков строк (тем более пиво в другом городе Sad )
Другое дело - твой Helper - замечательная штука! Но ведь ты же пиво за него не берешь.

#22:  Author: VolniyLocation: Местный PostPosted: Wed Nov 23, 2005 15:19
    —
Batya wrote:
Но ведь ты же пиво за него не берешь.

Дык никто ведь и не предлагает Very Happy А насчет "в другом городе", так для этого и придуманы виртуальные деньги, например WebMoney. Вполне доступно любому, имеющему выход в Интернет. Я вот однажды из Израиля "получил на пиво" именно таким способом. Без проблем. Я считаю, что современному человеку такой виртуальный счет совсем не помешает, тем более, что все это абсолютно бесплатно (не считая, конечно, небольшой пени /меньше 1%/ при переводе со счета на счет).

Ладно, проехали. Так что там с десятой беткой, замечания есть?

#23:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Nov 23, 2005 15:49
    —
Quote:
Так что там с десятой беткой, замечания есть?

Если честно, у меня совсем нет времени посмотреть Sad
А точнее - какой-нибудь интересной практической задачки, к которой можно прикрутить Helper.

#24:  Author: CaptainFlintLocation: Москва PostPosted: Wed Nov 23, 2005 17:28
    —
Есть вопрос. Пришёл вот отсюда: решил попробовать этот скрипт, а прожка-то и не работает... Точнее, не регистрируется. Запускал и обычным способом, и с ключом /REGISTER - пофиг. Запуск скрипта, приведённого в посте, на который я дал ссылку, приводит к ошибке:

---------------------------
Windows Script Host
---------------------------
Script: C:\tmp\tcwshelp_b10\1.vbs
Line: 6
Char: 1
Error: The system cannot find the file specified.
Code: 80070002
Source: (null)

---------------------------
OK
---------------------------

Шестая строка: Set TCS = CreateObject("TCScript.Helper"), поэтому похоже, что объект просто не зарегистрирован. Вопрос стандартный: кто виноват и что делать?

#25:  Author: Ciber SLasHLocation: С.-Петербург PostPosted: Wed Nov 23, 2005 17:46
    —
А меня вот интересует такой вопрос про WSH:
возможно ли вызывать API-функции из скрипта? Возможно как-нить через стандартные COM-объекты (ввиде "прокладки" к Win32API)...

#26:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Nov 23, 2005 18:14
    —
CaptainFlint
А что происходит при запуске TCWSHelp.exe?

Ciber SLasH
Вероятно можно. Только как, я еще не знаю.
Интересный пример на Jscript:
Code:
//JScript
var WshShell = WScript.CreateObject("WScript.Shell");
var Str;
KL = true;
Str = "THE MATRIX HAS YOU..." //Печатаемая строка
while (KL) {
  if (WshShell.AppActivate("Microsoft Word")) { //Проверка заголовока активного окна
  WriteWord("^+P36~"); //Установить размер шрифта 36 пт
  WriteWord("^B");     //Включить полужирное начертание
  for (i=0;i<=Str.length;i++)
    {
    WriteWord(Str.substring(i,i+1));
    }
  }
  KL = false;
  WScript.Sleep(10000);
}

function WriteWord(varWord) {
  WshShell.SendKeys(varWord);
  WScript.Sleep(300);
}

Сохранить в *.js, запустить, после этого запустить Word.

#27:  Author: CaptainFlintLocation: Москва PostPosted: Wed Nov 23, 2005 18:20
    —
Batya
Quote:
А что происходит при запуске TCWSHelp.exe?

Вываливает диалог About:
---------------------------
About Script Helper for TC
---------------------------
Script Helper ActiveX for Total Commander

Version: Beta10

Copyright (c) 2005, Volniy
E-mail: <removed>
---------------------------
OK
---------------------------


Last edited by CaptainFlint on Wed Nov 23, 2005 21:54; edited 1 time in total

#28:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Nov 23, 2005 18:24
    —
CaptainFlint
Хм... Вроде все нормально.
Ты же потом не убиваешь файл TCWSHelp.exe?
Может у тебя WHS кривой на машине? Где-то я это уже видел...
Попробуй создать другие объекты:
Code:
Set FSO = CreateObject("Scripting.FileSystemObject")
Set OS  = CreateObject("Shell.Application")

#29:  Author: CaptainFlintLocation: Москва PostPosted: Wed Nov 23, 2005 18:29
    —
Этот код выполняется.

Quote:
Ты же потом не убиваешь файл TCWSHelp.exe?

Нет, разумеется. Very Happy

#30:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Nov 23, 2005 18:51
    —
Тогда я не знаю.
Надо у автора Helper-а спросить.

Volniy, отзовись!

#31:  Author: Ciber SLasHLocation: С.-Петербург PostPosted: Wed Nov 23, 2005 20:21
    —
В принципе API-функции можно вызывать через RunDll32.exe, но получить возвращённое значение не получится Sad

Просто были мысли на WSH создать оконный интерфейс, т.е. создать окно "CreateWindowEx", напихать в него элементов и обрабатывать события... Тогда можно было бы фактически не имея компилятора лабать проги с оконным интерфейсом на любом компе с виндами...

#32:  Author: Ciber SLasHLocation: С.-Петербург PostPosted: Wed Nov 23, 2005 21:20
    —
Не пойму, почему не работает следующий JScript-код:
Code:
var WSH_Shell = WScript.CreateObject("WScript.Shell");
var SysPath = WSH_Shell.ExpandEnvironmentStrings("%WinDir%") + "\\system32";
WSH_Shell.Run(SysPath+'\\Rundll32.exe shell32,ShellExecuteA 0,"","","'+SysPath+'\\calc.exe","","",5');

?

#33:  Author: VolniyLocation: Местный PostPosted: Wed Nov 23, 2005 21:44
    —
Я, блин, болею сейчас, так что не очень-то на меня рассчитывайте Sad

По делу: минимальный код для проверки факта свершившейся установки Helpera в системе
Code:
Set TCS = CreateObject("TCSCRIPT.Helper")
TCS.About
Set TCS = Nothing

Чтобы она свершилась, пользователь во-первых должен иметь права записи в реестр. Кстати, командная строка неверно тут была упомянута, должна быть TCWSHelp.exe /REGSERVER (хотя для регистрации достаточно и простого запуска без командной строки). Тут есть важный момент: при использовании хелпера нужно быть уверенным, что он находится на том самом месте, где был при регистрации. CaptainFlint, это как раз твой случай, ругается именно на отсутствие файла EXE-сервера, а не на регисрацию. Ты его, часом не из архива запускал? Проверь.

PS CaptainFlint, ну и чего я тебе плохова сделал, а? Мыло мое вытри, плиз, из поста.

#34:  Author: CaptainFlintLocation: Москва PostPosted: Wed Nov 23, 2005 22:01
    —
Volniy
Quote:
Ты его, часом не из архива запускал? Проверь.

Нет, конечно. Сам о такой возможности подумал, уже всё это проверял (уже работал немного с подобными вещами, теперь к этому делу аккуратнее отношусь). Однако запуск TCWSHelp.exe /REGSERVER всё исправил! (Совсем слепой я стал, не вчитался, когда ридми читал, показалось, там REGISTER). Теперь всё работает, спасибо!

Quote:
PS CaptainFlint, ну и чего я тебе плохова сделал, а? Мыло мое вытри, плиз, из поста.

Ой, блин, извини, пожалуйста... Sad Не сообразил...

#35:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Nov 24, 2005 11:37
    —
CaptainFlint
Quote:
Однако запуск TCWSHelp.exe /REGSERVER всё исправил!

Дааа... Не ожидал от тебя такого Smile У меня даже мысли не было посмотреть синтаксис приведенной тобой команды. Все-таки копи-паст великая вещь Wink

Ciber SLasH
Quote:
Не пойму, почему не работает следующий JScript-код:

Я совсем не знаю, как работать с Rundll32. Что должно происходить? Приведи просто командную строку, которая работает.
По крайней мере, работает так:
Code:
var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.Run("calc.exe");

#36:  Author: CaptainFlintLocation: Москва PostPosted: Thu Nov 24, 2005 11:49
    —
Batya
Quote:
Не ожидал от тебя такого

Я сам от себя не ожидал такого. Smile
Просто в ридми такой упор делался на то, что всё регистрится автоматом, что с явным указанием ключа я запустил так, лишь бы отделаться и проверить путь, который 100% ничего не изменит Smile До копи-паста дело просто не успело дойти.

#37:  Author: Ciber SLasHLocation: С.-Петербург PostPosted: Thu Nov 24, 2005 11:58
    —
Вот, криво, но всё-таки работающий пример вызова API-функции MessageBoxA:
Code:
var WSH_Shell = WScript.CreateObject("WScript.Shell");
WSH_Shell.Run('Rundll32.exe user32.dll,MessageBoxA "API-функция: MessageBoxA"', 0x40)

#38:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Nov 24, 2005 13:15
    —
Ciber SLasH
Вот чего нарыл:
Исполнитель функций 32разрядных библиотек

#39:  Author: VolniyLocation: Местный PostPosted: Thu Nov 24, 2005 17:27
    —
Batya wrote:
Исполнитель функций 32разрядных библиотек[/url]

Это далеко не новинка, видел и покруче (поищи по словам "wsh API Toolkit OCX"), он и результат функций возвращает. У меня, кстати, есть один красивый Class c аналогичными делами, могу, если надо, впихнуть его в свой хелпер. А надо?

--

По поводу глюка автоматической регистрации. Похоже, он проявляется, если в полном пути к EXE есть пробелы (тут один на Английской странице уже заметил это дело и у меня тоже воспроизвелось оно). Учитывая тот факт, что авторегистрацию делаю не я, а сам компилятор, тут я ничем не могу помочь, хотя есть тут одна идейка...

--

PS Команды /REGSERVER и /UNREGSERVER - это не моя придурь, а стандартные команды (де)регистрации всех 32-битных EXE-серверов.
Можно, например, WinWord /REGSERVER испробовать, весьма прикольно выходит.

#40:  Author: CaptainFlintLocation: Москва PostPosted: Thu Nov 24, 2005 17:39
    —
Volniy
Quote:
По поводу глюка автоматической регистрации. Похоже, он проявляется, если в полном пути к EXE есть пробелы (тут один на Английской странице уже заметил это дело и у меня тоже воспроизвелось оно).

Первый раз, когда я экспериментировал, в пути, действительно, были пробелы. Но потом я решил на всякий случай без них, распаковал весь архив в C:\tmp\tcwshelp_b10\ - что в лоб, что по лбу.
Правда, теперь, уже после того, как сработал ключ /REGSERVER, авторегистрация начала работать (т.е. если сделать /UNREGSERVER (проверяю, действительно, скрипт перестаёт работать), а потом просто запустить TCWSHelp.exe, то регистрация нормально проходит, в том числе, когда путь с пробелами).

#41:  Author: VolniyLocation: Местный PostPosted: Thu Nov 24, 2005 18:09
    —
CaptainFlint wrote:
Правда, теперь, уже после того, как сработал ключ /REGSERVER, авторегистрация начала работать (т.е. если сделать /UNREGSERVER (проверяю, действительно, скрипт перестаёт работать), а потом просто запустить TCWSHelp.exe, то регистрация нормально проходит, в том числе, когда путь с пробелами).

У меня тоже так было. Непонятные какие-то дела. Я просто доку, наверное, перепишу.

#42:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Nov 24, 2005 18:51
    —
Volniy
Quote:
Это далеко не новинка, видел и покруче (поищи по словам "wsh API Toolkit OCX"), он и результат функций возвращает. У меня, кстати, есть один красивый Class c аналогичными делами, могу, если надо, впихнуть его в свой хелпер. А надо?

Наверное, надо.
Мне хочется того же, что и Ciber SLasH:
Quote:
Просто были мысли на WSH создать оконный интерфейс, т.е. создать окно "CreateWindowEx", напихать в него элементов и обрабатывать события... Тогда можно было бы фактически не имея компилятора лабать проги с оконным интерфейсом на любом компе с виндами...

Где бы еще почитать про API-функции, желательно по-русски.

И еще... Что-то по поиску, который ты предложил, все скаченные архивы zip (примеры, ocx) не открываются. Что за архивы буржуи выкладывают?

#43:  Author: VolniyLocation: Местный PostPosted: Thu Nov 24, 2005 19:16
    —
Batya wrote:
Мне хочется того же, что и Ciber SLasH

Окна - это уж слишком. Как он их там будет субклассить в скриптах? У меня была идея конструктора форм. Тоесть задать набор сттандартных элементов, а уже пользователь сам выбирает, что из них показывать и в каком месте формы. Но потом посмотрел, что это геморрой весьма конкретный и отказался я от этой идеи.

Quote:
Где бы еще почитать про API-функции, желательно по-русски.

Есть в сети немного, но в основном, на Английском, конечно. Привыкай. Или лучши купи хорошую книгу по API.

Quote:
Что за архивы буржуи выкладывают?

Вот выложил тот, что есть у меня.

#44:  Author: Lev PostPosted: Sat Nov 26, 2005 00:09
    —
Никак не могу разобраться с Буфером обмена. Создаю в буфере текст - "фыва", на всякий случай проверяю содержимое.
Code:
Dim TCS
Set TCS = CreateObject("TCSCRIPT.Helper")
TCS.SetTextToClip ("фыва")
msgbox TCS.GetTextFromClip

Начинаю вставлять - в одних программах - фыва
в других - ôûâà, думается тут каким-то боком примостился Юникод.
И никак не придумывается, чего надо сделать, чтобы везде было "фыва". Sad
Может сам Хелпер должен быть подкручен?

#45:  Author: VolniyLocation: Местный PostPosted: Sat Nov 26, 2005 03:01
    —
Lev wrote:

Начинаю вставлять - в одних программах - фыва
в других - ôûâà, думается тут каким-то боком примостился Юникод.
И никак не придумывается, чего надо сделать, чтобы везде было "фыва". Sad

Ты прав, это глюк Юникода. Там получается, что содержимое буфера обмена зависит от активной раскладки клавиатуры. Если она русская - все нормально, если нет - глюк. На данный момент я в хелпере не работаю с буфером напрямую, а только делаю обертку для готовых методов VB. Это они так работают. Аналогичная проблема и с методом SendKeystroke - если шлешь русский текст, то может быть послано такое же черте-че. Короче, проблема есть. Правда, ее можно уговорить одним стандартным рег-файликом, но это нежелательно. Я как-нибудь попробую переписать эти функции через WinAPI.

#46:  Author: LocKtaR-o-DarKLocation: Москва PostPosted: Sat Dec 03, 2005 05:12
    —
необходимо поменять кодировку с cp_1252 на cp_1251, 1)используя редактор реестра (для продвинутых), 2)скачав с нета готовые *.reg или *.exe файлы или 3)пользуясь различными твикерами, мне больше всего по душе знаменитый xptweacker, на xp и xpsp1 все корректно, в xpsp2 уже есть несколько неточностей (проверял лично), но большинство настроек выполняет неплохо даже в сп2 об этом уже давно всем известно господа, инет полон инфы об этом, так что ищем поиском

#47:  Author: VolniyLocation: Местный PostPosted: Sat Dec 03, 2005 15:15
    —
LocKtaR-o-DarK wrote:
...об этом уже давно всем известно господа, инет полон инфы об этом, так что ищем поиском


От того, каким именно способом ты изменишь запись в Реестре (хоть твикером, хоть рег-файлом, хоть даже прямым редактированием бинарных файлов реестра из другой операционной системы Shocked ), суть все равно не меняется. Я не сказал, что я не знаю что нужно изменить, я сказал, что это не очень-то правильный способ, потому как затрагивает абсолютно все программы, написанные из расчета на кодировку 1252 (Latin). Например, про немецкие умляуты можно забыть - вместо них будут русские буквы. Да мало ли чего еще может случиться в таких программах.
Это - кривой способ.

#48:  Author: KPOBABAK PostPosted: Tue Dec 27, 2005 19:50
    —
[quote=
Это - кривой способ.[/quote]

согласен на 100% в одном месте исправляет в другом портит.

#49:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Apr 14, 2006 16:31
    —
Вот подумал, что может кому-нить пригодится...
На старом форуме появилась задача по поиску и замене текста в выделенных файлах:
Quote:
1. выделяем файлы для редактирования
2. жмем сочетание клавиш (т.е. запускаем плагин) и в появившемся маленьком поле ввода пишем то, что нужно найти и заменить. Жмем ок.
3. в появившемся после этого окне пишем то, НА чТО надо заменить. Жмем ок.

Написал vbs-скрипт, использующий EmEditor (версия EmEditor-а - 4.13, не знаю, как на пятерке работать будет):
Code:
'==================================================================
' Поиск и замена строк в выделенных файлах в TC с помощью EmEditor

' В параметрах вызова из TC должно быть прописано:
' %L
'
' Ниже задайте правильный путь к EmEditor
'==================================================================

Dim Editor
'-------- Путь к EmEditor -----------------------
Editor = "d:\Program Files\EmEditor\emeditor.exe"
'------------------------------------------------

Dim WS, FSO, StreamFile, Find_String, Replace_String, Current_File, MsgBut
Set WS = WScript.CreateObject("WScript.Shell")
Set FSO = CreateObject("Scripting.FileSystemObject")
Set StreamFile = FSO.OpenTextFile(WScript.Arguments(0), 1)

Find_String = InputBox("Введите искомую строку", "Поиск и замена")
if Len(Find_String) = 0 then
 MsgBut = MsgBox("Не задана строка для поиска!", vbOKOnly + vbExclamation, "Поиск и замена")
 WScript.Quit()
End if
Replace_String = InputBox("Введите строку для замены", "Поиск и замена")

Do While Not StreamFile.AtEndOfStream
 Current_File = StreamFile.ReadLine
 WS.Run """" & Editor & """ /fc """ & Find_String & """ """ & Current_File & """ /rw """ & Replace_String & """"
Loop

StreamFile.Close
Set WS = Nothing
Set FSO = Nothing
Set StreamFile = Nothing
Wscript.Quit

#50:  Author: Zergal PostPosted: Tue May 16, 2006 14:53
    —
2Volniy - спасибо за прогу, люблю новые идеи.

2Batya
Наверно вызываю неверно -как правильно прикрутить к total'у?
я сунул в панель, мышой тащу туда файлы, в итоге цикл идёт по строчкам а не по файлам...
поясни непонятливому фразу:
' В параметрах вызова из TC должно быть прописано:
' %L

PS в итоге просто иконку сделал "C:\Program Files\EmEditor\emeditor.exe" /rd


Last edited by Zergal on Wed Nov 25, 2009 18:20; edited 1 time in total

#51:  Author: BatyaLocation: Москва, Россия PostPosted: Tue May 16, 2006 15:10
    —
Zergal
Сохраняем код в файл, например, ReplaceInFiles.vbs.
В этом файле меняем "d:\Program Files\EmEditor\emeditor.exe" на "C:\Program Files\EmEditor\emeditor.exe" (твой путь).
Делаем кнопку вида (скопируй код, нажми прав. кнопку мыши на панели и скажи "Вставить"):
Code:
TOTALCMD#BAR#DATA
d:\WHS\ReplaceInFiles.vbs
%L
shell32.dll,22
Поиск и замена в файлах


-1

Измени кнопку - поменяй путь к ReplaceInFiles.vbs на свой.

Как работает.
1. Выделяешь файлы.
2. Нажимаешь кнопку.
3. В появившемся окне пишешь то, что нужно найти и заменить. ОК.
4. В появившемся после этого окне пишешь то, НА ЧТО надо заменить. ОК.

#52:  Author: Zergal PostPosted: Tue May 16, 2006 19:49
    —
Вот это мне и было нужно, спасибо.
Я чуть поменял пример из Борна, добавил Батин скрипт, взболтал но не перемешивал и получил то же но быстрее и без всяких emeditor.exe за которых между прочем бабки просят Wink
Code:

'**************************************************
' File:    ReplaceTxt.vbs (WSH sample in VBScript)
' Author:  (c) G. Born, Batya, Zergal
'
' Что-то меняет в Ваших файлах
' УРА - Никакого бэкапа!!!
'**************************************************
Option Explicit
Dim WS, FSO2, StreamFile, Find_String, Replace_String, Current_File, MsgBut
Set WS = WScript.CreateObject("WScript.Shell")
Set FSO2 = CreateObject("Scripting.FileSystemObject")

Set StreamFile = FSO2.OpenTextFile(WScript.Arguments(0), 1)

Find_String = InputBox("Введите искомую строку", "Поиск и замена")
if Len(Find_String) = 0 then
 MsgBut = MsgBox("Не задана строка для поиска!", vbOKOnly + vbExclamation, "Поиск и замена")
 WScript.Quit()
End if
Replace_String = InputBox("Введите строку для замены", "Поиск и замена")


      ' We must define ForWriting because the
      ' iomode constants are unknown to VBScript.
      Const ForWriting = 2              ' iomode: write access

'      Const inF = "TestFile.txt"
'      Const outF = "TestFile1.txt"

Do While Not StreamFile.AtEndOfStream


      ' Here are the strings for replacement.

      Dim Text
      Dim fso, oFile                 ' Object variable
      Dim oFileIn, oFileOut   ' Text stream
      Dim path, fileIn, fileOut

      path = StreamFile.ReadLine         ' Retrieve current path to script.
      fileIn = path    ' Create filenames.
      fileOut = left(path, len(path)-4) & "_" & right(path,4)

      ' Create a FileSystemObject object to access the file system.
      Set fso = CreateObject("Scripting.FileSystemObject")

      If Not fso.FileExists(fileIn) Then  ' Input file exists?
          WScript.Echo "File '" & fileIn & "' not found"
          WScript.Quit 1
      End If

      ' Input file present; open file and create output file.
      Set oFileIn = fso.OpenTextFile(fileIn)   ' Open input file.
      Set oFileOut = fso.OpenTextFile(fileOut, _
                          ForWriting, True)    ' Open output file.

      Do While Not (oFileIn.atEndOfStream)
          Text = oFileIn.ReadLine              ' Read a line.
          Text = Filter(Text, Find_String, Replace_String)
          oFileOut.WriteLine Text              ' Write text.
      Loop
      oFileOut.Close
      oFileIn.Close
      fso.DeleteFile FileIn
      Set oFile = fso.GetFile(fileOut) 
      oFile.move FileIn
      Set oFileOut = nothing
      Set oFileIn = nothing
Loop
Function GetPath
    ' Retrieve the script path.
    Dim path
    path = WScript.ScriptFullName  ' Script name
    GetPath = Left(path, InStrRev(path, "\"))
End Function

Function Filter(txt, expr1, expr2)
    ' Replace expr1 with expr2 in text.
    Dim oReg

    Set oReg = New RegExp        ' Create regular expression.
    oReg.Global = True           ' All matches
    oReg.IgnoreCase = True       ' Make case-insensitive.

    ' Replace all expr1 with expr2.
    oReg.Pattern = expr1          ' Set pattern.
    Filter = oReg.Replace(txt, expr2)
End Function

'*** End



ЗЫ Может сбоить на символах, которые не понимает шаблон.
Не причёсывал, лень лохматая.
Ругайтесь, мне будет приятно.


Last edited by Zergal on Wed Nov 25, 2009 09:51; edited 1 time in total

#53: 4-ая редакция Author: VolniyLocation: Местный PostPosted: Tue May 16, 2006 22:28
    —
Почти то же самое, но только по-человечески Wink
Code:
'=========================[ Start of file ]=========================
'  File:         ReplaceInFiles.vbs
'  Description:  Производит поиск текста с заменой
'                в выделенных текстовых файлах     
'  Installation: Создайте кнопку на панели TC
'                Команда: "диск:\путь\к\файлу\ReplaceInFiles.vbs"
'                Параметры: "%L"
'  Copyright:    (c) 2006-2008, Volniy

Option Explicit

Dim FSO, Find_String, Replace_String, F, Buffer, ListFile, Found
Const ForReading = 1, ForWriting = 2

Set FSO = CreateObject("Scripting.FileSystemObject")

Find_String = InputBox("Введите искомую строку", "Поиск и замена")
If Len(Find_String) = 0 Then
   MsgBox "Не задана строка поиска!", vbExclamation, "Поиск и замена"
   WScript.Quit()
End If

Replace_String = InputBox("Введите строку для замены", "Поиск и замена")

Set ListFile = FSO.OpenTextFile(WScript.Arguments(0), 1)
Do While Not ListFile.AtEndOfStream
   Call DoItForThisFile(ListFile.ReadLine)
Loop
ListFile.Close
Set ListFile = Nothing
Set F = Nothing
Set FSO = Nothing

MsgBox "Поиск с заменой завершен!", vbInformation, "Поиск и замена"
WScript.Quit

Sub DoItForThisFile(FilePath)
   Set F = FSO.OpenTextFile(FilePath, ForReading)
   Buffer = F.ReadAll
   F.Close
   Found = InStr(1, Buffer, Find_String, 1)
   If Found <> 0 Then
     Buffer = Replace(CStr(Buffer), Find_String, Replace_String,1,-1,1)
     'FSO.CopyFile FilePath, FilePath & ".bak"
     Set F = FSO.OpenTextFile(FilePath, ForWriting)
     F.Write Buffer
     F.Close
   End If
End Sub
'=========================[  End of file  ]=========================


Изменил немного код, чтобы файлы, в которых разыскиваемая строка отсутствует, не перезаписывались (действительно, нах оно?).


Last edited by Volniy on Thu Oct 30, 2008 01:40; edited 8 times in total

#54:  Author: Zergal PostPosted: Tue May 16, 2006 22:47
    —
Минуточку, это красиво, но задача была менять во многих файлах!
А тут насколько я понял один файл берется... цикл нужен.
Проверка показала что моя прога каким-то образом пропускает файлы некоторые... Sad нужен ремонт.
Буфер поддерживаю это красивей значительно. Но без цикла никак. у меня энтих файлов 15000.
Где почитать про параметры вызова? не смог найти.


Last edited by Zergal on Wed Nov 25, 2009 18:01; edited 1 time in total

#55:  Author: VolniyLocation: Местный PostPosted: Wed May 17, 2006 00:00
    —
Zergal wrote:
Минуточку, это красиво, но задача была менять во многих файлах!
А тут насколько я понял один файл берется... цикл нужен.

Ну нужен, так нужен. "КАкие прАблемы"(с)
Добавил цикл (исправил код в первом сообщении). Оно?

#56:  Author: Zergal PostPosted: Wed May 17, 2006 07:48
    —
Volniy wrote:
Ну нужен, так нужен. "КАкие прАблемы"(с)
Добавил цикл (исправил код в первом сообщении). Оно?

Вот теперь кррасота! Полейзнейшая вещь имхо. Маглобт.


Last edited by Zergal on Wed Nov 25, 2009 14:49; edited 3 times in total

#57:  Author: BatyaLocation: Москва, Россия PostPosted: Wed May 17, 2006 12:42
    —
Volniy
Красиво.
А у меня, видимо, клины были, что я EmEditor использовал вместо команды Replace Very Happy

#58:  Author: fundukLocation: Санкт-Петербург PostPosted: Wed May 31, 2006 23:59
    —
На руборде в скриптик добавили поддержку регэкспов.

#59:  Author: KoSLocation: Киев PostPosted: Tue Jun 13, 2006 15:18
    —
Я по ctrl+b в директории с кучей вложенных директорий показываю все файлы, потом их фильтрую по ctrl+F12 с помощью сохраненного регулярного выражения. Меня интересует вопрос: как узнать количество оставшихся файлов и занести это число в переменную?

Когда все выделяю - снизу отображается кол-во выделенных файлов, но как-бы это число вытащить?

Я сложным замученым методом через архивацию в lst узнаю это число, но когда его копирую, почему-то не могу вставить. Пробовал посмотреть значение GetTextFromClip в попапе - выдает пустую строку.

Пользуюсь Хелпером бета7 и писал js-скрипт. Может, для Хелпера нужно обязательно vbs?

Да, все-таки, основной мой вопрос - как затащить в переменную количество выделенных файлов?

#60:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Jun 13, 2006 17:02
    —
js-файл:
Code:
/* ====================================
   Подсчет количества выделенных файлов
   Параметры вызова из TC:
   %L
==================================== */
var objArgs, FSO, TextFile, i = 0;
objArgs = WScript.Arguments;
FSO = new ActiveXObject("Scripting.FileSystemObject");
TextFile = FSO.OpenTextFile(objArgs(0));
while (!TextFile.AtEndOfStream)
{
  i++;
  TextFile.SkipLine();
}
TextFile.Close();
WScript.Echo("Выделено " + i + " файлов");

#61:  Author: KoSLocation: Киев PostPosted: Tue Jun 13, 2006 17:40
    —
Спасибо за скрипт, но он не работает
Строка: 9
Символ: 1
Ошибка: Файл не найден
Код: 800А0035

Еще я не понимаю, как этот кусок кода можна всунуть в остальной скрипт, если нужен параметр (я просто не разбираюсь в параметрах вызова файлов, и, в частности, не знаю, что это за параметр %L)

И еще - как должен открыться текстовый файл, если не было команды его создать? Он автоматически создается?

#62:  Author: fundukLocation: Санкт-Петербург PostPosted: Tue Jun 13, 2006 17:50
    —
Работает всё. Просто после добавления этого скрипта в панель, нажми на новой кнопке правой кнопкой мыши, выбери "изменить", и нажми F1 - увидишь справку.
Потом добавь %L в поле "параметры".

#63:  Author: KoSLocation: Киев PostPosted: Tue Jun 13, 2006 18:33
    —
Спасибо огромное. Работет. Я просто не туда вводил параметр - затупил. Теперь буду пробовать со своим скриптом.

#64:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Jun 14, 2006 09:43
    —
KoS
Лучше напиши, что ты скриптом делаешь. Возможно, мы тебе покажем более красивые варианты решения твоей задачи.

#65:  Author: KoSLocation: Киев PostPosted: Wed Jun 14, 2006 14:08
    —
У меня есть директория с вложеными папками, где хранятся обои рабочего стола. Я полгода назад написал небольшой скриптик, который открывает эту папку, показывает все файлы и случайным образом выбирает файл (случайное число раз нажимает кнопку "ВНИЗ" на клаве). Количество картинок, из которых случайно выбиралась одна, я вводил вручную. Тогда это было не критично, так как новые обои поступали редко.

Потом я понял, что не все обои хороши как обои, хоть я их и сортировал, и удалял некрасивые. Некоторые хороши художественно, но не подходят. Некоторые, хоть и симпотичные, но на 1600х1200 мутноваты итд. Тогда я время от времени стал перед именем файла ставить балл от 1 до 5. 5 - обои, которые мне ООЧень нравятся. 3 - нормальные. 2 - немного раздражают итд. И вот пару дней назад решил обновить свой старый скрипт.

Выборка обоев идет с помощью регулярных выражений в фильтре. Оставалось лишь ввести выбор случайного из даного количества, так как сегодня, например, я хочу обоину с рейтингом 5, а завтра, например, мне будет все-равно, и соглашусь на любую от 3 до 5.

С помощью твоего скрипта у меня все заработало, только мне пришлось его дополнить снизу выбором случайного числа и запихнуть в меню "Запуск", так там можно было поставить параметр. А первая часть скрипта вызывается с панели, открывает новую вкладку, там показывает обои, выделяет их и запускает по хоткею скрипт с узнаванием кол-ва файлов и выбором случайной обои.

Весь скрипт заточен на постоянные директории и на определенные комбинации клавиш. Хоть это и дурной тон, но делал-то я его для себя.

#66:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Jun 14, 2006 14:35
    —
Quote:
... только мне пришлось его дополнить снизу выбором случайного числа и запихнуть в меню "Запуск", так там можно было поставить параметр. А первая часть скрипта вызывается с панели ...

Бред какой-то. А что мешает все написать в одном скрипте, который будет вызываться либо из меню "Запуск", либо с панели? Параметр можно указать и там, и там.
Приведи код своих скриптов. Я помогу их переделать. Я бы и сейчас написал, только лень выдумывать алгоритм случайного выбора файла, да и твой критерий поиска по категориям я не знаю.

#67:  Author: KoSLocation: Киев PostPosted: Wed Jun 14, 2006 15:32
    —
буду дома, выложу скрипт.

А на счет все в одном скрипте, объясню. Сразу я тоже так хотел. Но если я запускаю основной скрипт с параметром, создается файл, который отвечает за выделенные файлы. Это значит, что когда я в скрипте выделяю файлы, твой код уже считает не те файлы, которые я сейчас скриптом выделил, а те, которые были выделены до запуска скрипта.
Это если я правильно понял. Потому что я еще дома немало повозился, пока нормально соединил твой и свой, с позволения сказать Smile, скрипты

С панели я вызываю основной скрипт, который выделяет нужные файлы, потом, чтобы создался тот темповский файл, в который входят имена выделенных файлов, нужно запустить твой скрипт отдельно. Хоткей и параметр на него можно наложить, если он в меню "запуск". Поэтому я разбил выполнение на два скрипта.

#68:  Author: fundukLocation: Санкт-Петербург PostPosted: Wed Jun 14, 2006 15:48
    —
Вернёмся к обоям: тебе из большого числа обоев надо выбрать ровно одну? Почему именно скриптом, а не встроенным в тотал поиском?

Вообще, для случайности выбора можно попользоваться плагином misc.

#69:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Jun 14, 2006 15:49
    —
Даю наводку - а зачем вообще выделять найденные скрипты, что если искать самим скриптом и применять случайный алгоритм к списку найденных файлов?

#70:  Author: KoSLocation: Киев PostPosted: Wed Jun 14, 2006 20:19
    —
funduk, не знаю, что за плагин misc, так как уже месяца три не обновлял свои плагины и не смотрел, что нового на сайте

Batya, я так, по-моему, и делаю

А вот и сами скрипты:
Code:

// KoS Скрипт первый
// Ставим wallpaper, который имеет рейтинг более трех включительно
// Файлы имеют вид: 4 Cat.jpg или 5 Abstract.bmp

//--------------------------------------------------------
//Открываем временно новую вкладку. Потом, в конце, мы ее закроем.
//Обои лежат в папке, которая вызывается из Favorites: ctrl+d f w

var xxx = WScript.CreateObject("WScript.Shell");

xxx.SendKeys("^{t}");
xxx.SendKeys("^{d}");
xxx.SendKeys("{f}");
xxx.SendKeys("{w}");
xxx.SendKeys("^{b}");
  WScript.Sleep(300);
 
// Устанавливаем фильтр по ctrl+F12
// Там условие следующее: [345] (.*).(jpg|bmp)
// В меню выбора он вызывается >345
xxx.SendKeys("^{F12}"); 
xxx.SendKeys(">");
xxx.SendKeys("345");
xxx.SendKeys("{ENTER}");

xxx.SendKeys("^{a}"); // Выделяем все файлы

xxx.SendKeys("^%{F1}"); // Запускаем другой скрипт, который висит в меню "Запуск" на ctrl+alt+F1


Второй скрипт:
Code:

/* ====================================Batya
   Подсчет количества выделенных файлов
   Параметры вызова из TC: %L
==================================== */
var objArgs, FSO, TextFile, p = 0;
objArgs = WScript.Arguments;
FSO = new ActiveXObject("Scripting.FileSystemObject");
TextFile = FSO.OpenTextFile(objArgs(0));
while (!TextFile.AtEndOfStream)
{
  p++;
  TextFile.SkipLine();
}
TextFile.Close();


//===============================================KoS

var xxx = WScript.CreateObject("WScript.Shell");


var r = Math.random()
for (var i = 1; i <= r * p; i++)
xxx.SendKeys("{DOWN}");

xxx.SendKeys("^%{F2}"); //пришлось установить команду "снять все выделение" на дополнительную комбинацию клавиш: ctrl+alt+F2, потому что в скрипте почему-то не работали ни ctrl+Num-, ни Num*
//Может, я их не правильно записывал, может для Num нужно что-то особенное

xxx.SendKeys("{F3}");
  WScript.Sleep(100);
xxx.SendKeys("+{e}"); // у меня на просмотр картинок стоит "sgviewer"
  WScript.Sleep(100);
xxx.SendKeys("{ESC}");
xxx.SendKeys("^{F10}");
xxx.SendKeys("^{w}"); // закрываем вкладку
WScript.Sleep(100);

#71:  Author: fundukLocation: Санкт-Петербург PostPosted: Wed Jun 14, 2006 20:23
    —
А плагина misc на сайте нет. На форуме есть тема про неучтённые плагины.

#72:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Jun 15, 2006 13:35
    —
KoS
Вот так, на мой взгляд, будет красивее:
Code:
var objArgs, FSO, MyPictures, PicturesRank, FileArray = new Array( ), r, Irfan, WshShell;
// ============= Задайте каталог картинок ===============
MyPictures = "c:\\MyPictures\\Collection";
// ============== Задайте путь IrfanView ================
Irfan = '"D:\\Program Files\\IrfanView\\i_view32.exe"'
// ======================================================

// === Минимальное желаемое качество картинок ===
objArgs = WScript.Arguments;
if (objArgs.length == 0)
  PicturesRank = 5;
else
  PicturesRank = objArgs(0);
 
FSO = new ActiveXObject("Scripting.FileSystemObject");
ToProcess(MyPictures);

r = Math.round(Math.random() * FileArray.length);
WshShell = WScript.CreateObject("WScript.Shell");
WshShell.Run(Irfan + " " + FileArray[r] + " /wall=2 /killmesoftly");

function ToProcess(FolderPath)
{
  var ParentFolder, FilesCollection, FoldersCollection, FileName, FileExt;
  ParentFolder      = FSO.GetFolder(FolderPath);
  FilesCollection   = new Enumerator(ParentFolder.files);
  FoldersCollection = new Enumerator(ParentFolder.SubFolders);

  // === Обработаем вложенные файлы ===
  for (; !FilesCollection.atEnd(); FilesCollection.moveNext())
  {
    FileName = FilesCollection.item().Name;
    FileExt  = FSO.GetExtensionName(FilesCollection.item()).toLowerCase( );
    // === Условие отбора картинок ===
    if ((FileName.substr(0, 1) >= PicturesRank) && ((FileExt == "jpg") || (FileExt == "bmp")))
    {
      FileArray = FileArray.concat(FilesCollection.item());
    }
  }
  // === Обработаем вложенные папки ===
  for (; !FoldersCollection.atEnd(); FoldersCollection.moveNext())
  {
    ToProcess(FoldersCollection.item());
  }
}

Установку обоев сделал через IrfanView - можно сделать через командную строку.
Скрипту в качестве параметра можно передать цифру - категорию картинки. Если не передано, по умолчанию - 5. Скрипт ищет картинки с категорией не меньше указанной. Если нужен другой алгоритм поиска, скрипт легко переделать.

Удачи!

P.S. Если где-то можно скрипт упростить, прошу не ругаться - на Java Script пишу мало.

#73:  Author: KoSLocation: Киев PostPosted: Thu Jun 15, 2006 14:29
    —
Я поражен красотой скрипта! Все работет. Проверял в разных ситуациях.
Хоть и не все мне понятно. Как сложный английский текст - многие слова понятны, некоторые конструкции ясны, общий смысл улавливаю, но конкретно пересказать не смогу. Smile

Спасибо. Реально намного более гибкий скрипт.

А на счет js.. Smile
Я пишу скрипты на том языке, для которого в мануале нашел описание на нужную функцию или вообще кусок аналогичного примера
Поэтому мне это не так принципиально Smile

Но за красивый скрипт - огромное спасибо! Получаешь огромное удовольствие, когда после неуклюжего монстра смотришь на токого элегантного джентельмена Wink

#74:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Jun 15, 2006 15:24
    —
Я доволен, что скрипт понравился Smile
Если что-то конкретно не понятно, спрашивай.

#75:  Author: FktrcLocation: Кемерово PostPosted: Thu Jul 13, 2006 13:25
    —
Volniy wrote:
Это далеко не новинка, видел и покруче (поищи по словам "wsh API Toolkit OCX")
А попробуй вот это: http://www.yandex.ru/yandsearch?rpt=rad&text=wsh+API+Toolkit+OCX&numdoc=0 Very Happy

#76:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Jul 13, 2006 13:53
    —
Fktrc
Это ты к чему? Или ссылку перепутал?

#77:  Author: VolniyLocation: Местный PostPosted: Thu Jul 13, 2006 15:55
    —
Batya wrote:
Fktrc
Это ты к чему? Или ссылку перепутал?

Походу, он поисковик перепутал Razz
Yandex дает ссылку только на саму эту фразу и ВСЕ Shocked . Вот тебе и поисковик. Google Forever Exclamation

#78:  Author: FktrcLocation: Кемерово PostPosted: Fri Jul 14, 2006 07:46
    —
Ничего не попутал, просто забыл слово "лопата" в конец поста приписать Smile

#79: Сообщение сделал, чтобы не постить скрипт в чужую тему Author: VolniyLocation: Местный PostPosted: Sun Sep 03, 2006 15:32
    —
Пишем VBS-файл вот с таким содержимым
Code:
'=========================[ Start of file ]===================
'  File:         Separators.vbs
'  Description:  Производит переключение между 3-мя любыми
'                позициями разделителя панелей ТС
'  Installation: Создайте новую команду в меню Запуск TC
'                Команда: "диск:\путь\к\файлу\Separators.vbs"
'                Назначьте на нее горячую клавишу
'  Copyright:    (c) 2006, Volniy

Option Explicit
Dim TCS
Const Pos1=85, Pos2=15, Pos3=50

Set TCS = CreateObject("TCScript.Helper")

TCS.LockTC True

If TCS.Separator < 0 Or TCS.Separator > 100 Then
   TCS.SendCommand "cm_50Percent", True
End If

Select Case CInt(TCS.Separator)
Case (Pos2 - 1), Pos2, (Pos2 + 1)
   TCS.Separator = Pos3
Case (Pos3 - 1), Pos3, (Pos3 + 1)
   TCS.Separator = Pos1
Case (Pos1 - 1), Pos1, (Pos1 + 1)
   TCS.Separator = Pos2
Case Else
   TCS.Separator = Pos3
End Select

TCS.LockTC False
Set TCS = Nothing
Wscript.Quit()
'=========================[  End of file  ]===================

ставим на него комбинацию клавиш в меню Запуск и пользуемся ею для быстрого переключения между тремя произвольными позициями разделителя панелей TC (Pos1, Pos2, Pos3) (скрипт можно легко изменить, увеличив число позиций) при наличии установленного в системе Script Helper ActiveX for Total Commander [24 кб].

Из-за взаимодействия нажатой клавиатуры и действий скрипта по перемещению разделителя иногда может понадобиться повторное нажатие (разделитель уходит в 100%). И вообще кнопка на панели будет работать надежнее.

#80:  Author: Uy PostPosted: Sun Sep 17, 2006 20:20
    —
А исходники хелпера открыты?

#81:  Author: VolniyLocation: Местный PostPosted: Sun Sep 17, 2006 22:16
    —
Uy wrote:
А исходники хелпера открыты?

Пока нет Embarassed

#82:  Author: Uy PostPosted: Mon Sep 18, 2006 09:06
    —
А можно узнать хотя бы как работает функция SendCommand?

#83:  Author: VolniyLocation: Местный PostPosted: Mon Sep 18, 2006 12:12
    —
Code:
SendMessage(TCMainHwnd, 1075, cmdnumber,  0)

#84:  Author: Uy PostPosted: Mon Sep 18, 2006 17:18
    —
Огромное спасибо! )) Жду с нетерпением новых версий и, конечно, раскрытие исходников. Удачи!

#85:  Author: ParcanLocation: Russian PostPosted: Tue Sep 19, 2006 16:59
    —
Вопрос может не совсем по теме:
заметил что после работы чистильщиков реестра в скриптах перестает работать конструкция "Set Query = New RegExp" типа такого объекта не существует.
сейчас реестр вообще не чищу, но если не изменяет память пользовался следующими: блин память изменяет, помоему WWW-расшифровку не помню, из NeoUtilities, RegCleaner который потом стал каким то там jtools или что то созвучное возможно еще чемто, вообще за свою жизнь пользовался 5ю чистильщиками реестра и после всех был один и тот же результат.
это как нибудь можно поправить? а то у меня в 1С один скрип из за этого не работает, который ну очень облегчает жизнь при конфигурировании.

#86:  Author: VolniyLocation: Местный PostPosted: Tue Sep 19, 2006 17:56
    —
Выполни в командной строке
Code:
regsvr32 vbscript.dll
находясь в системной папке винды.

#87:  Author: ParcanLocation: Russian PostPosted: Wed Sep 20, 2006 10:47
    —
спасибо дома попробую, но мне наверное потребуется regsvr32 jscript.dll

#88:  Author: VolniyLocation: Местный PostPosted: Wed Sep 20, 2006 12:56
    —
Parcan wrote:
но мне наверное потребуется regsvr32 jscript.dll

Если у тебя скрипты написаны на JScript, то - да. В любом случае лучше при таких проблемах полностью переустановить WSH. Переустановка не создает никаких дополнительных проблем.

#89:  Author: Uy PostPosted: Wed Sep 20, 2006 13:31
    —
Хотелось бы узнать, появится ли возможность установки хуков на события в ТС? Или это невозможно выполнить посредством СОМ-сервера?

#90:  Author: VolniyLocation: Местный PostPosted: Wed Sep 20, 2006 23:47
    —
Uy wrote:
Хотелось бы узнать, появится ли возможность установки хуков на события в ТС? Или это невозможно выполнить посредством СОМ-сервера?

Даже не знаю, что ответить Confused . Трудно уложить рядом на одну полку хуки и COM-сервер, написанный на VB. Да и к чему это все нужно?

#91:  Author: Mayskii PostPosted: Fri Sep 22, 2006 21:02
    —
Ребят извиняюсь за жуткий оффтоп, но не могли бы вы сказать где можно скачать документацию по VBScript, желательно на русском , в личку.Ещё раз извиняюсь.
Просто охото что нибудь написать для Total'a посерьёзнее, а то знаю только SendKeys Smile

P.S.Только пожалуйста msdn.microsoft.com не предлагать, винда у меня все равно пиратская Smile

#92: Не пропадать же добру :) Author: VolniyLocation: Местный PostPosted: Sun Sep 24, 2006 15:32
    —
Code:
'=========================[ Start of file ]===================
'  File:         EraseCDRW.vbs
'  Description:  Производит очистку RW диска, используя
'                движок Nero версии 6 и выше
'  Installation: Создайте кнопку или команду в меню Запуск TC
'                Команда: "диск:\путь\к\файлу\EraseCDRW.vbs"
'                Если приводов у Вас два, то возможно, что
'                (0) понадобится заменить на (1)
'  Copyright:    (c) 2006, Volniy

Option Explicit
Dim n, d, et
Set n = CreateObject("Nero.Nero")
Set d = n.GetDrives(262172)(0)
d.LoadCD
et=d.CDRWErasingTime(True)
d.EraseCDRW(True)
WScript.Sleep et*1000
d.EjectCD
Set d=Nothing
Set n=Nothing
Wscript.Quit()
'=========================[  End of file  ]===================

#93:  Author: aLexxLocation: Новокузнецк PostPosted: Sun Sep 24, 2006 17:48
    —
Вон куда всё зашло... Very Happy
А всего-то хотелось сидюком управлять из ТС...

#94:  Author: Mayskii PostPosted: Mon Sep 25, 2006 11:03
    —
Люди подскажите как сделать комментарий для сразу нескольких файлов.Вот что у меня получилось:

Code:

'==========================================================================
'
' VBScript Source File -- Created with SAPIEN Technologies PrimalScript 4.0
'
' NAME: GroupDescription.vbs
'
' AUTHOR: Artem Mayskii
' DATE  : 25.09.2006
'
' COMMENT: Групповое создание комментариев
'
'==========================================================================
Option Explicit

Dim TCS, CopyFClip, Sel, FSO, TextStream, Clip, Descript, Sp
Set TCS = CreateObject("TCScript.Helper")

Sp = " "
Descript = "Описание"
Sel = TCS.GetSrcSelectedFiles(-1)

TCS.SendCommand("cm_CopyNamesToClip")

Clip = TCS.GetTextFromClip

Set FSO = CreateObject("Scripting.FileSystemObject")
Set TextStream = FSO.CreateTextFile("C:\descript.ion")

TextStream.WriteLine Clip & Descript



Но опять же комментарий создаётся только для одного файла Laughing .
Что нужно ещё дописать?


P.S Кто нибудь обязательно спросит а что это за странная переменная Sp ?! Smile
Поскольку я не знаю как делать пробелы, я создал такую переменную но её я в скрипте ещё не задействовал.

#95:  Author: BatyaLocation: Москва, Россия PostPosted: Mon Sep 25, 2006 11:26
    —
Mayskii
Mayskii wrote:
Люди подскажите как сделать комментарий для сразу нескольких файлов.

А чем не устраивает мой скрипт?

#96:  Author: Mayskii PostPosted: Mon Sep 25, 2006 11:35
    —
Ух ты спасибо, всему причина моя лень, надо было ветку прочитать.
Будем разбираться Smile

#97:  Author: Dystopian PostPosted: Wed Oct 18, 2006 03:47
    —
Помогите, пожалуйста. Мне нужна кнопка в тотале, которая копирует полный путь файла в буфер, но все пробелы в пути заменяет на "%20"(для вставки ссылки в чате). Ясно, что без скрипта не обойтись. И очень хочется на чистом VBS. Можно упростить его до того, что он будет просто работатьс буфером, а загнать путь туда я смогу горячей клавишей, но хочется, конечно, все за один клик мыши. С кнопками и ее параметрами я разобрался, но вот выучить еще один язык программирования... Я хорош в С, с VB не сложилось как-то.

#98:  Author: D1PLocation: Тбилиси PostPosted: Wed Oct 18, 2006 12:43
    —
http://tckb.mega-byte.info/content/view/221/100/

Приведённый скрипт преобразует все нелатиинские символы, если надо "чинить" только пробелы, то исправление скрипта для человека, хорошо знающего C не составит проблемы.

Да, перед выполнением преобразования нужно сначала скопировать ссылку в буфер омбена - на это есть cm_CopyFullnamesToClip

#99:  Author: Dammer PostPosted: Mon Nov 06, 2006 16:47
    —
Я тут fs плагин слепил - отображает содержимое WMI namespaces, просматаривать метаинформацию класса + все экземпляры класса ( если есть в системе) + позволяет генерить строго типизиваное описание класса для следующих языков Visual Basic, C#, JScript, J#, C++.
Для работы ессено юзает .Net 2.0.

Kому надо - пишем в личку, скину мылом

#100:  Author: fundukLocation: Санкт-Петербург PostPosted: Mon Nov 06, 2006 23:02
    —
2Dammer
Выкладывай на ifolder.ru. Кому надо, скачает.

#101:  Author: Dammer PostPosted: Tue Nov 07, 2006 15:26
    —
WMIExplorer доступен здес:
http://shareua.com/files/9e8eeb/wfx_WMIExplorer_1.0.zip.html
Для работы НУЖЕН .Net Framework 2.0 !!!

#102:  Author: VolniyLocation: Местный PostPosted: Wed Nov 08, 2006 03:01
    —
Давно хотел написать, но все забывалось как-то. Есть очень хорошая программа для редактирования и отладки VBS-скриптов. Это VBSEdit. Кстати, в комплекте с ней идет MSDN-овская документация по WSH, скачать которую с сайта MS затруднительно (по известным причинам). В программе есть множество различных готовых шаблонов-заготовок кода.

Чего я ее сейчас вспомнил? Да уж больно хорошо она показывает всю инфу по объекту WMI, как в прочем и по любому другому объекту включенному в скрипт через CreateObject.

Короче, настоятельно рекомендую!

#103:  Author: Dammer PostPosted: Wed Nov 08, 2006 15:21
    —
2 Volniy
А лекарственные средства для него есть?

#104:  Author: CaptainFlintLocation: Москва PostPosted: Wed Nov 08, 2006 15:42
    —
Если даже и есть, здесь их обсуждать запрещено по п. 5 правил!

#105: переименование файла и копирование нового имени файла в буфе Author: LA_ PostPosted: Wed Jan 10, 2007 16:21
    —
написал следующий скрипт для переименования файла и копирования нового имени файла в буфер обмена
(файл переименовывается в соответствии со след логикой:
имяфайла.расширение -> имяфайла.[тэг].расширение
Code:

'****************************************************************
' Copyright (c) LA

' This script renames given in parameter file in accordance with
' the following logic:
'   filename.ext -> filename.[tag].ext
' and copies the result filename to clipboard.

'****************************************************************
' Version:

' 1.0 10 Jan 2007 - Initial release

'****************************************************************
' Parameters

 strTag = "[tag]"

'****************************************************************

' script arguments
Set objArgs = WScript.Arguments
' if argument (filename) is not given, then exit
If WScript.Arguments.Count <> 1 Then
  WScript.Quit
End If

Set objFSO = CreateObject("Scripting.FileSystemObject")
' get file passed as first arguments to the script
Set objFile = objFSO.GetFile(objArgs(0))
' create new file name as path + filename + [tag] + extension
strNewName = objFSO.GetParentFolderName(objFile) & "\" & objFSO.GetBaseName(objFile) & "." & strTag & "." & objFSO.GetExtensionName(objFile)
objFSO.MoveFile objArgs(0), strNewName

' copy new file name to clipboard with IE usage
'Set objIE = CreateObject("InternetExplorer.Application")
'objIE.Navigate("about:blank")
'objIE.document.parentwindow.clipboardData.SetData "text", strNewName
'objIE.Quit

' copy new file name to clipboard by sending Ctrl+Shift+Ins
' refreshing panel before copying
WScript.CreateObject("WScript.Shell").SendKeys "^{R}"
WScript.Sleep(100)
WScript.CreateObject("WScript.Shell").SendKeys "^+{INSERT}"

' copy new file name to clipboard with TCHelper usage
'Set TCS = CreateObject("TCScript.Helper")
'TCS.cm_CopyNamesToClip

первая часть (переименование) работает отлично, а вот со второй частью (копирование имени в буфер) возникли проблемы - я нашел три варианта, как можно копировать (через IE, посылая комбинацию ctrl+shift+ins TC и через TCHelper)
какой предпочесть? если используется первый (через IE), то IE запрашивает разрешение скопировать данные в буфер, что не есть хорошо.
если второй (посылая комбинацию ctrl+shift+ins TC), то команда cm_CopyNamesToClip должна быть назначена на ctrl+shift+ins. И что произойдет, если во время выполнения скрипта я переключусь на другое приложение? ctrl+shift+ins будет послано куда-то не туда?
последний вариант, наверное, наилучший, но не позволит использовать скрипт вне TC (как, впрочем, и второй). ну и не нравится необходимостью установки TCHelper'a
может есть более лучшие варианты?

#106:  Author: mozersLocation: с Нижнего PostPosted: Fri Feb 02, 2007 23:22
    —
Quote:
m> 3. Какого хрена cm_ConfigChangeIniFiles открывает файлы только в
m> Блокноте ? Умнее было бы использовать редактор, заданный в
m> параметре "Editor=" wincmd.ini И уж если там ничего не задано то
m> тогда только notepad.
m> В свете последних решений, к wincmd.ini и ftp.ini можно бы добавить
m> usercmd.ini

давно сэра Гислера об этом вопрошают и упрошают, он клянётся и божится, что мы
на самом деле счастья своего не понимаем, что это супер-удобно и супер-надёжно:
как же, вдруг на какой-то системе не окажется того самого редактора, который ты
собственными ручками указал в настройках; как же ты тогда INI-файлики-то
отредактируешь...


В продолжение этого диалога появился ЭТОТ СКРИПТ

Теперь пишем в usercmd.ini
Code:
[em_configChangeIniFiles]
cmd=%COMMANDER_PATH%\Utils\WSH\em_configChangeIniFiles.js


И заменяем в WINCMD.MNU так задолбавшую команду на нашу:
Code:
MENUITEM "Р&едактировать файлы конфигурации", em_configChangeIniFiles


Радуемся жизни Smile

#107:  Author: BommLocation: Москва PostPosted: Mon Feb 05, 2007 18:14
    —
Я в скриптах не большой специалист, скорей маленький Smile
Смотрю. с помощью данного скрипта (спасибо mozers за него!!!) у меня не загружается <файл>.mnu
Начал анализировать и выяснил, что команда ReadINI чувствительно к реестру, и в скрипте написано
var wincmd_mnu = ReadINI (wincmd_ini, 'MainMenu','');
а у меня в wincmd.ini - 'Mainmenu'
Причем я не сам вроде бы писал, это TC записал так Wink
Исправил - заработало!

Непорядок! Надо как то избавится от регистра, я не знаю даже, если ли тут команды перевода в другой регистр
Специалисту виднее
А вдруг вообще окажется 'mainmenu'?? Crying or Very sad

Вот такое, как мне кажется, конструктивное замечание...

#108:  Author: mozersLocation: с Нижнего PostPosted: Tue Feb 06, 2007 00:04
    —
2Bomm
Спасибо за верное замечание Smile Вот НОВАЯ ВЕРСИЯ
Если бы у Вас стоял Script Helper (c)Volniy то эту ошибку Вы бы не обнаружили Wink

#109:  Author: aLexxLocation: Новокузнецк PostPosted: Sun Jun 24, 2007 22:32
    —
Очень долгое время пользуюсь скриптом от Volniy для маркировки файлов через один (зеброй).
Но меня очень выламывало перед вызовом этого скрипта выделять всё, а уж потом запускать его.
Творчески подойдя к процессу, слегка переделал этот скрипт.

Code:

' File:         ZebraMark.vbs
' Description:  Помечает все файлы и каталоги через один.
' Requirements: WSH Helper for TC by Volniy
' Copyright:    (c) 2007, Volniy, aLexx

Option Explicit
Dim FSO, ListFile, SelFile, TCS
Dim File1, File2, Cnt, Buf
Const ForWriting = 2
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TCS = CreateObject("TCScript.Helper")

TCS.SendCommand ("cm_SelectAll")  'Выбрать всё
TCS.SendCommand ("cm_CopyFullNamesToClip")  'Копируем в буфер
Set ListFile = FSO.OpenTextFile("1.txt", ForWriting, True) 'Сохраняем в файл
ListFile.Write TCS.GetTextFromClip
ListFile.Close
Set ListFile = FSO.OpenTextFile("1.txt", 1)
Do While Not ListFile.AtEndOfStream
  SelFile = ListFile.ReadLine
  Cnt = Cnt + 1
  File2 = FSO.GetFileName(SelFile)
  If Cnt Mod 2 = 0 Then
     Buf = Buf & SelFile & vbNewLine
  End If
Loop
ListFile.Close
TCS.ClearClip
TCS.SetTextToClip CStr(Buf)
TCS.SendCommand "cm_LoadSelectionFromClip", True
FSO.DeleteFile("1.txt")

Set ListFile = Nothing
Set FSO = Nothing
Set TCS = Nothing
MsgBox "Выделено ""зеброй"":): " & Cnt \ 2 & " файлов и каталогов.", vbInformation, "Завершено!"
WScript.Quit

#110:  Author: VolniyLocation: Местный PostPosted: Mon Jun 25, 2007 11:07
    —
aLexx wrote:
.
Творчески подойдя к процессу, слегка переделал этот скрипт.


Ну и я тоже переделал Rolling Eyes . Вариант без использования промежуточного файла:

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) ' Получаем массив имен
For Cnt=LBound(List) 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

Set TCS = Nothing
MsgBox "Выделено ""зеброй"":): " & Cnt \ 2 & " файлов и каталогов.", vbInformation, "Завершено!"
WScript.Quit

#111:  Author: aLexxLocation: Новокузнецк PostPosted: Mon Jun 25, 2007 13:15
    —
Красава! А сразу нельзя было так сделать? Smile

Зато вот этот кусок из моего скрипта можно использовать для записи выделения
(без содержания вложенных папок) в текстовый файл:

Code:

' File:         SaveMark.vbs
' Description:  Сохраняет выделение в файл. Параметром идёт имя файла.
' Requirements: WSH Helper for TC by Volniy
' Copyright:    (c) 2007, aLexx

Option Explicit
Dim FSO, TCS, ListFile
Set FSO = CreateObject("Scripting.FileSystemObject")
Set TCS = CreateObject("TCScript.Helper")

If WScript.Arguments.Count > 0 Then
  TCS.SendCommand ("cm_CopyFullNamesToClip")  'Копируем выделение в буфер
  Set ListFile = FSO.OpenTextFile(WScript.Arguments(0), 2, True) 'Сохраняем в файл
  ListFile.Write TCS.GetTextFromClip
  ListFile.Close
End If

Set ListFile = Nothing
Set FSO = Nothing
Set TCS = Nothing
WScript.Quit


Это только пинок для творчества. Можно добавить, куда сохранять получаемый текстовый файл
(даже вторым параметром), можно сделать имя файла по имени каталога и т.д.

#112:  Author: Pazzi PostPosted: Sat Aug 25, 2007 03:38
    —
Привет всем. начал вот познавать WSH. радуюсь не нарадуюсь, как можно себе жизнь упростить встроенными в тотал скриптами! конечно не все гладко и поэтому у меня сходу несколько вопросов.

1. скрипт у меня получает список выделенных файлов через %L и копирует в цикле эти файлы в другое место file.copy("path")... таким образом на сколько я понял каждый следующий файл начинает копироваться ещё до того как закончит копироваться предыдущий, и общее время копирования сильно увеличивается. можно ли как-то заставить скрипт ждать пока не закончится копирование одного файла и только потом начинать копирование следующего?

2. Можно ли как-то интерактивно отображать состояние копирования?

3. После копирования вывожу вывожу сообщение, что все успешно закончилось WScript.Echo(finalReport); так сообщение появляется свернутым или просто на заднем плане, на таскбаре кароче мигает,а фокус у тотала. переделал вывод сообщения на var vbSystemModal=4096; wsh.Popup(finalReport,0,"Success report",vbSystemModal); так сообщение конечно появляется поверх всех окон, но фокус всеровно теряет, что оч странно для модального окна... в чем проблема?

#113:  Author: VolniyLocation: Местный PostPosted: Sat Aug 25, 2007 23:02
    —
1. Вряд ли время копирования так уж увеличится, если копироваться будут одновременно несколько файлов (если конечно источником файлов будет не CD/DVD). Я, конечно, не знаю, как там у тебя выдается команда на копирование, но если обрабатывать все файлы в одном скрипте, то копирование будет происходить последовательно - пока предыдущий не скопируется, следующий не начнет копироваться.

2. Во первых, а что такое состояние копирования? Если это число уже скопированных файлов, то можно время от времени показывать тот же popup с этим числом, время показа установить по минимуму (1 секунда).

3. vbSystemModal пришла еще с 16-битного API. Там это был действительно модальный результат - все приложения были недоступны пока не закроется мессага, показанная с такой константой. Ну, а в Win32 vbSystemModal гарантирует только, что окно сообщений будет показано поверх окон всех других приложений, но не более того:
Документация MSDN wrote:
vbSystemModal = 4096
System modal. On Win16 systems, all applications are suspended until the user responds to the message box. On Win32 systems, this constant provides an application modal message box that always remains on top of any other programs you may have running.

#114:  Author: Pazzi PostPosted: Sun Aug 26, 2007 16:03
    —
1. цикл приблизительно такой:
Code:

do
{
   nextFile=FilesList.Readline();

   var fFile=fso.GetFile(nextFile;

   fFile.Copy(path,false);
   WScript.Sleep(200);
}
while(!FilesList.atEndOfStream)

FilesList - это то что параметром %L передается.

может конечно они и последовательно передаются... но вот без Sleep все-таки было дольше=)

2. в идеале конеш чтоб показывалось и для каждого файла, какая его часть уже скопировалась) может можно как-то копировать вызовом виндосной апи-функции с сопутствующим открытием стандартного окна копирования?

3. тоесть модальным окно никак не сделать?
а фокус почему может терятся?

#115:  Author: VolniyLocation: Местный PostPosted: Mon Aug 27, 2007 18:35
    —
Pazzi wrote:
1. цикл приблизительно такой:
Code:
do
{
   nextFile=FilesList.Readline();

   var fFile=fso.GetFile(nextFile;

   fFile.Copy(path,false);
   WScript.Sleep(200);
}
while(!FilesList.atEndOfStream)


Нету никакого смысла в создании объекта File если нужно только скопировать файл. FSO имеет для этого специальный метод:
Code:
{
   nextFile=FilesList.Readline();
   fso.CopyFile (nextFile, path, false);
   WScript.Sleep(200);
}

Насчет задержки могу только предположить (IMHO), что системе нужно некоторое время, чтобы посливать файловые буфера на диск.

Pazzi wrote:
2. в идеале конеш чтоб показывалось и для каждого файла, какая его часть уже скопировалась) может можно как-то копировать вызовом виндосной апи-функции с сопутствующим открытием стандартного окна копирования?


В принципе стандартный шелловский диалог копирования можно вызывать, просто вызывая шелловскую функцию копирования. Для этого даже существует специальный объект:
Code:
var oShell = WScript.CreateObject("Shell.Application");

готового примера использования не дам, я как-то не пользовался сам. Так что примеры поищи в сети.
Вот, например. Только что нашел Гуглом: http://www.script-coding.info/WSH/Shell.html
Пример взят именно оттуда (правда тут VB синтаксис, но думаю разберешься):
Code:
Set objShellApp = CreateObject("Shell.Application")
Set objFolder = objShellApp.NameSpace("C:\WINDOWS")
objFolder.CopyHere("C:\AUTOEXEC.BAT")


Pazzi wrote:
3. тоесть модальным окно никак не сделать?

Из скрипта? Это врядли. Скриптовые возножности в этом плане очень сильно ограничены. Это же фактически набор команд, при чем тут визуальный интерфейс? Ну мессадж бокс можно показать, ну окошко ввода строки, и это практически все. Хочешь GUI из скрипта - добавляй внешние визуальные объекты. Хотя, имхо, тут уж будет естественнее переходить на какой-то из языков программирования, позволяющий создавать графический интерфейс.

Pazzi wrote:
а фокус почему может терятся?

А хз, видимо какое-то приложение затребовало его. У тебя же много чего одновременно работает. Кстати, я попробовал у себя запустить подобный скрипт и у меня такой потери фокуса после показа мессаги не происходит...

#116:  Author: Pazzi PostPosted: Mon Aug 27, 2007 22:49
    —
Спасибо за помощь, Volniy!
и за хелпер тоже респект)

#117:  Author: Pazzi PostPosted: Fri Sep 07, 2007 21:17
    —
не работает пример из книги Борна (самый последний в chapter 9).
ошибка возникает на строчке
Code:
oIE.Document.ValidForm.fRemark.Value = "No remarks"

пишет "обьект не поддерживает это свойство или метод: 'Document.ValidForm' "
кто-нибудь знает в чем проблема?
как обращаться к элементам формы?

#118:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Dec 14, 2007 10:20
    —
"Нда... Давно не брал я шашки в руки"

Pazzi
Попробуй так:
Code:
oIE.Document.GetElementByID("fRemark").Value = "No remarks"

#119:  Author: Victor_Dobrov PostPosted: Wed Jul 23, 2008 05:46
    —
Сделал скрипт, переключающий фильтры или показывающий в тек. панели файлы того же типа, который перетащили на кнопку.

Code:
[Buttonbar]
button=Wcmicons.dll,47
cmd=SwitchFilter.vbs
param=Исполняемые
menu=SwitchFilter


Code:
'SwitchFilter.vbs   (требуется установленный Script Helper ActiveX for TC)
'Параметры: шаблон поиска или фильтр. Если шаблон поиска содержит пробелы, заключите его в кавычки.
'Обычный клик по кнопке скрипта установит/выключит фильтр/шаблон в текущей панели.
'Если на кнопку перетащить файл, в панели остануться только объекты того же типа.

Set TCS = CreateObject("TCSCRIPT.Helper")

[sFilter]="имитация ключа ini-файла"
   sFilter="*.exe"
   sFilter = Replace(sFilter, Chr(34),"")

If WScript.Arguments.Count > 0 Then    'запуск без параметров переключает последний фильтр
   sFilter = WScript.Arguments(0)
   If CreateObject("Scripting.FileSystemObject").FileExists(sFilter) Then sFilter = "*." + LCase(Left(Split(sFilter, ".")(Ubound(Split(sFilter, "."))), Sgn(Ubound(Split(sFilter, "."))) * Len(Split(sFilter, ".")(Ubound(Split(sFilter, "."))))))
   TCS.INIWrite WScript.ScriptFullName, "sFilter", "sFilter", Chr(34) + sFilter + Chr(34)    'запомнить фильтр
End If

   If InStr(sFilter,"*") = 0 Then sFilter = Chr(62) & sFilter

If TCS.GetFilter(TCS.GetSrcPath) <> sFilter Then
   TCS.SendCommand "cm_SrcUserDef"
   TCS.SendKeystroke sFilter & "{ENTER}"
Else
   TCS.SendCommand "cm_SrcAllFiles"
End If

#120:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Jul 23, 2008 10:11
    —
Интересный подход.

Только что-то уж больно заморочено определяется расширение файла.
Гораздо проще использовать метод GetExtensionName объекта FileSystemObject.

#121:  Author: Victor_Dobrov PostPosted: Thu Jul 24, 2008 01:23
    —
Batya wrote:
Гораздо проще использовать метод GetExtensionName объекта FileSystemObject.

Для имени файла к примеру Noname функция FSO.GetExtensionName(File) возвращает имя файла, а нам ведь надо тип! Поэтому я и сделал по-своему.

#122:  Author: VolniyLocation: Местный PostPosted: Fri Jul 25, 2008 10:32
    —
А проверить? Если у файла нет расширения этот метод возвращает пустую строку. Просто выполни вот такой 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

#123: Re: 3-ая редакция Author: djalexv PostPosted: Tue Oct 28, 2008 21:07
    —
Volniy wrote:
Почти то же самое, но только по-человечески Wink
[code]'=========================[ Start of file ]=========================
' File: ReplaceInFiles.vbs
' Description: Производит поиск текста с заменой
' в выделенных текстовых файлах
' Installation: Создайте кнопку на панели TC
' Команда: "диск:\путь\к\файлу\ReplaceInFiles.vbs"
' Параметры: "%L"
' Copyright: (c) 2006-2008, Volniy
...
Изменил немного код, чтобы файлы, в которых разыскиваемая строка отсутствует, не перезаписывались (действительно, нах оно?).


Возможно у меня все таки проблема с руками но ... в моем случае (*.ini - файлы .. найдены стандартным поиском с поиском текстовой строки.... находятся в разных подпапках одной папки.... ) кроме самой замены удаляет весь текст который находился в файлах с начала и до первой замены Crying or Very sad

#124: Re: 3-ая редакция Author: VolniyLocation: Местный PostPosted: Thu Oct 30, 2008 01:52
    —
djalexv wrote:
Возможно у меня все таки проблема с руками


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

Code:
Buffer = Replace(CStr(Buffer), Find_String, Replace_String, 1, -1, 1)

Эти изменения я внес и в исходное сообщение со скриптом.

#125:  Author: djalexv PostPosted: Thu Oct 30, 2008 12:03
    —
Благодарю Very Happy

#126:  Author: aLexxLocation: Новокузнецк PostPosted: Thu Nov 27, 2008 14:41
    —
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, скрипт не отрабатывает.
Пишет "Выделено "зеброй"Smile: 0 файлов и каталогов.", хотя файлов море! Пришлось для обхода
этой ситуации ввести If...Else.
Выяснилось, что в этих случаях UBound(List) равен -1. Т.е., не отрабатывает строка
List = Split(... и т.д. А не отрабатывает потому, что не выполняется команда
"cm_CopyFullNamesToClip", т.е. буфер обмена пустой.
Может, это зависит от размера получаемого списка файлов? И "cm_CopyFullNamesToClip"
выполняется слишком долго? Или есть какой-то лимит на этот размер?
Иногда у меня этот список получается до 20 тыщ файлов! В тексте это более 3 метров.
Как это победить?

#127:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Nov 27, 2008 18:24
    —
aLexx wrote:
Как это победить?

Можно получать список файлов не через буфер, а пердавать через параметр %L.

#128:  Author: aLexxLocation: Новокузнецк PostPosted: Thu Nov 27, 2008 18:38
    —
Я про это думал... Но не придумал, как!
Опыта маловато...

#129:  Author: Riemann PostPosted: Sat Jan 31, 2009 16:14
    —
Volniy
Так как постоянно работаю с тоталом в висте, имею ряд ограничений связанных с неработоспособностью скриптов основанных на TCWSHelp.exe Вроде промелькало где то сообщение о баге, но про работоспособность не отписалось. Сделав свою сборку, навесив нужные кнопки раздал её пользователям XP и надеюсь када нить решить с вистой проблему.

#130:  Author: VolniyLocation: Местный PostPosted: Sat Jan 31, 2009 21:00
    —
А по-конкретней нельзя ли? Что за "ряд ограничений"? Может просто влом vb5 рантаймы поставить? Могу на VB6 перекомпилировать (если исходник найду, конечно).

#131:  Author: Riemann PostPosted: Thu Feb 05, 2009 00:56
    —
Вот конкретнее


Предполагаю, что на винде 7-ке аналогичная проблема.

#132:  Author: VolniyLocation: Местный PostPosted: Thu Feb 05, 2009 02:39
    —
А регистрация хелпера проходит без ошибок? Я имею ввиду запуск экзешника TCWSHelp.exe.

#133:  Author: Riemann PostPosted: Thu Feb 05, 2009 11:34
    —
Регистрация проходит без ошибок, внесение без проблем. А эффекта нет.

#134:  Author: ParcanLocation: Russian PostPosted: Tue May 12, 2009 17:20
    —
А можно ли в скрипте узнать не запущен ли он уже?
Чтобы если скрипт запустить 2 раза один выполнялся а второй чухал это и закрывался бы.

#135:  Author: BatyaLocation: Москва, Россия PostPosted: Wed May 13, 2009 17:20
    —
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

#136:  Author: ParcanLocation: Russian PostPosted: Thu May 14, 2009 16:57
    —
Batya
спасибо

#137:  Author: kadvlad PostPosted: Fri Sep 11, 2009 21:15
    —
Друзья,
помогите разобраться с TCWSHelp

после установки системы (XP SP2) файл находился в папке тотала по адресу c:\Program Files\Totalcmd\plugins\script Helper b10\TCWSHelp.exe
Впоследствие перенёс папку Тотала на др. раздел, и после этого все скрипты перестали работать: выдаёт ошибку в строке
Code:
Set TCS = CreateObject("TCScript.Helper")

Запуск-регистрация TCWSHelp в новом месте (и даже переустановка WSH) ничего не дали. Если оставить одну только эту утилиту по старому адресу — всё работает как надо.

Можно ли как-то "перерегистрироваться", чтобы удалить хэлпера из старого места и оставить в новом?
Спасибо.

#138:  Author: Tol!kLocation: Арзамас PostPosted: Fri Sep 11, 2009 21:28
    —
Попробуй сначала выполнить TCWSHelp.exe /UNREGSERVER по старому месту прописки

#139:  Author: kadvlad PostPosted: Fri Sep 11, 2009 21:34
    —
Как всё просто, однако.
Спасибо, помогло.

#140:  Author: Darkman PostPosted: Fri Sep 25, 2009 22:30
    —
При запуске Script Helper выдает следующую ошибку



Total Commander 7.50a, ошибка проявляется как на Windows 7, так и на XP.
Может какие-нибудь библиотеки нужны, которые у меня отсутствуют?

#141:  Author: VolniyLocation: Местный PostPosted: Sat Sep 26, 2009 16:51
    —
Попробуй установить VB5 рантаймы. Ссылка. А затем сверху установи VB6 рантаймы. Ссылка.

Давно собираюсь скомпилировать под VB6, но руки никак не доходят. Может кто-то сможет напомнить мне про что-нибудь обещанное мною к добавлению в тулзу? Я бы тогда заодно с добавлением и перекомпилировал.

#142:  Author: Darkman PostPosted: Sat Sep 26, 2009 22:03
    —
Volniy wrote:
Попробуй установить VB5 рантаймы. Ссылка. А затем сверху установи VB6 рантаймы. Ссылка.


Рантаймы установил, перезагрузился, результата - ноль, та же ошибка.
Пробовал удалять регистрацию ключом /unregserver, запускал в режиме совместимости с XP SP2, от имени администратора - бестолку.
Есть еще идеи?

P.S. Windows 7, TC 7.50a

#143:  Author: DrSharkLocation: Kyiv, Ukraine PostPosted: Sat Sep 26, 2009 23:45
    —
Volniy wrote:
Может кто-то сможет напомнить мне про что-нибудь обещанное мною к добавлению в тулзу? Я бы тогда заодно с добавлением и перекомпилировал.
Открыть исходники (правда, не обещанное, но было бы неплохо)

#144:  Author: VolniyLocation: Местный PostPosted: Sun Sep 27, 2009 03:54
    —
Darkman wrote:
Есть еще идеи?


Просто перекомпилировал на VB6(SP6) (вроде бы это был самый последний билд). Проверь как это отразится на работоспособности.

http://volniy.nm.ru/tcwshelp_b10%2b.rar

#145:  Author: Darkman PostPosted: Sun Sep 27, 2009 08:13
    —
Volniy wrote:
Просто перекомпилировал на VB6(SP6) (вроде бы это был самый последний билд). Проверь как это отразится на работоспособности.

http://volniy.nm.ru/tcwshelp_b10%2b.rar

Урааааааааааааааа! Заработало!!! Very Happy

Спасибо огромное!!!

#146:  Author: Andrey_ALocation: Сочи PostPosted: Fri Feb 12, 2010 04:55
    —
У меня не срабатывает нажатие клавиши CAPSLOCK
Code:
' Имитирует нажатие клавиши CAPSLOCK
Set TCS = CreateObject("TCSCRIPT.Helper")
TCS.SendKeystroke "{CAPSLOCK}"
Wscript.Quit

и ещё как имитировать нажатье WIN (кнопка с флажком)

#147:  Author: VolniyLocation: Местный PostPosted: Thu Mar 11, 2010 02:59
    —
Script Helper ActiveX for Total Commander, beta11
tcwshelp_b11.rar (30 kb)


Отличия от предыдущей бета-версии:
* Устаранен баг установки разделителя панелей в случае использования мышки, настроенной для работы левой рукой
* Устаранен баг установки разделителя в позицию 100%
* Перекомпилировано в VB6 (для повышения стабильности и улучшения совместимости)
* Метод UserCmd для вызова определенных в TC пользовательских функций вида EM_xxx
* Методы SetSrcPath и SetTrgPath для открытия заданных путей в панелях Тотала (опционально - в новых вкладках). Если указать путь к файлу, тогда дополнительно этот файл получит фокус в файловой панели

До кучи:
* Метод Sleep, вызывающий задержку выполнения скрипта указанной длительности. Является аналогом метода Sleep объекта WScript.Shell, но не требует создания этого объекта
* {SPACE} или {SP} можно использовать в методе SendKeystroke вместо пробела для лучшей читаемости скриптов на форуме. (С множителем пока что не работает!)

--

Andrey_A, подтверждаю. Походу глюк VB, ибо с SendKeys объекта WScript.Shell работает нормально. Используй пока что такой вызов.


Last edited by Volniy on Fri Mar 12, 2010 01:01; edited 1 time in total

#148:  Author: prog_sanLocation: Пенза PostPosted: Thu Mar 11, 2010 09:26
    —
Volniy
Спасибо. А заодно и устранилась бага с разворачиванием панели на 100% http://forum.wincmd.ru/viewpost.php?p=52504

#149:  Author: prog_sanLocation: Пенза PostPosted: Thu Mar 11, 2010 09:28
    —
Ан, нет... В задачах системы остается запись 100% Sad

#150:  Author: VolniyLocation: Местный PostPosted: Thu Mar 11, 2010 11:19
    —
Я, к сожалению, не видел (или попросту забыл) сообщение об этой баге. Надо бы, конечно, посмотреть что за дела. Сейчас не смогу, исходники только дома есть.

А вообще там такая заморочка: при перемещении разделителя Тотал кажет подсказку с процентами возле указателя мышиного, потом убирает его сам. Когда же я делаю программное перемещение, эти подсказки отчего-то не убираются (их может набраться много), поэтому я сам их закрываю в конце перемещения. Почему 100% не удаляется это надо посмотреть, скорее всего при поиске окон для текста окна я неудачную маску выбрал.

--

UPD Именно так все и оказалось. Исправил, файл по ссылке выше заменил. Так что можешь перезагрузить и проверить.

#151:  Author: AgereS PostPosted: Thu Mar 25, 2010 13:17
    —
Возможно я сейчас скажу глупость
я у себя не нашёл TCWSHelp.exe
он ставиться отдельно или должен идти вместе с Total Commander

#152:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Mar 25, 2010 13:29
    —
AgereS
Разумеется, отдельно! Между прочим, это было всего несколькими постами раньше в этой же теме.
И сколько можно напоминать про поиск по форуму?
Лимит глупых вопросов исчерпан, далее будут санкции от модератора. Правила форума — в шапке любого подфорума. Например, здесь.

#153:  Author: AgereS PostPosted: Fri Mar 26, 2010 14:24
    —
Вроде частично разобрался спасибо
Вот только почему (маркировка файлов через один)
срабатывает не всегда так и не могу понять



P|S Avada - Что касается поиска, то если бы я знал как сформулировать вкраци то что ищу, то явно воспользовался им

#154:  Author: Tol!kLocation: Арзамас PostPosted: Fri Mar 26, 2010 14:46
    —
Да, забавно работает (ZebraMark-2.vbs):
Сначала выделил 60 файлов (правильно, в папке 121 файл)
Затем опять 60 файлов
Затем 30 файлов (я не поверил глазам и не снял скриншот)
Затем 15 файлов

Затем всегда "0" файлов, после перезапуска TC нормальная работа скрипта не восстанавливается

TC 7.50a, Script Helper beta11, beta10+
В папках с малым кол-вом файлов (<20) работает правильно

#155:  Author: FlasherLocation: Москва PostPosted: Fri Mar 26, 2010 16:15
    —
Tol!k
Сам этот скрипт иногда использовал в разных по объёму папках, ничего подобного не замечалось.
Добавлено: А вот в режиме BranchView срабатывает криво. Ну тут причина ясна: относительные пути.

#156:  Author: sa PostPosted: Fri Mar 26, 2010 16:57
    —
AgereS wrote:
Вот только почему (маркировка файлов через один) срабатывает не всегда так и не могу понять

Не показалось, что не выделяются файлы, в которых имеются символы на русском? По-моему, имеется проблема с копированием имён этих файлов в буфер.

#157:  Author: VolniyLocation: Местный PostPosted: Sat Mar 27, 2010 02:43
    —
Причина выделения нестабильного количества файлов очевидна. В начале скрипта есть команда выделения всех файлов и она не всегда успевает выполнится до начала исполнения следующей команды. А значит скрипт работает с меньшим кол-вом файлов. Решается просто:
Code:
TCS.SendCommand "cm_SelectAll", True


Что касается "невыделения" файлов с русскими именами, то это косяк с русским юникодом. Пока не знаю, что с этим делать. Возможно, поможет классика - редактирование реестра, вроде вот оно:
Code:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1250"="c_1251.nls"
"1252"="c_1251.nls"
только я сам пробовать не стал, меня этот патч не устраивает по многим причинам.

Что касается BranchView, так там действительно дело в относительных путях. Решаемо:
Code:
' File:         ZebraMark-3.vbs
' Description:  Помечает все файлы и каталоги через один
' What's new:   Работает в BranchView
' Requirements: WSH Helper for TC by Volniy
' Copyright:    (c) 2010, Volniy

Option Explicit
Dim List, TCS, Cnt, Buf, CurDir
Set TCS = CreateObject("TCScript.Helper")

TCS.SendCommand "cm_SelectAll", True  'Выбрать всё
CurDir = TCS.GetSrcPath
TCS.SendCommand "cm_CopyFullNamesToClip", True
List = Split(TCS.GetTextFromClip,vbNewLine)

For Cnt=LBound(List) To UBound(List)
  If Cnt Mod 2 = 1 Then
     Buf = Buf & Mid(List(Cnt), Len(CurDir) +2) & vbNewLine
  End If
Next
TCS.SetTextToClip CStr(Buf)
TCS.SendCommand "cm_LoadSelectionFromClip", True
TCS.GetSrcSelectedFiles

MsgBox "Выделено ""зеброй"": " & (UBound(TCS.GetSrcSelectedFiles) +1) & _
       " файлов/каталогов." , vbInformation, "Завершено!"
Set TCS = Nothing
WScript.Quit


Last edited by Volniy on Sat Mar 27, 2010 14:21; edited 2 times in total

#158:  Author: Tol!kLocation: Арзамас PostPosted: Sat Mar 27, 2010 03:25
    —
Volniy wrote:
Решается просто:
Code:
TCS.SendCommand "cm_SelectAll", True
Ни один файл не выделяется, но при этом радостно сообщается, что выделено 60…30…15… файлов.
Решилось так
Code:
TCS.SendCommand "cm_SelectAll", False
TCS.SendCommand "cm_CopyFullNamesToClip", True

Volniy, а почему не помогает пауза? Даже TCS.Pause = 1000

На память, пропущенный в прошлый раз скриншот
http://i054.radikal.ru/1003/f6/511078bb93cd.png

#159:  Author: sa PostPosted: Sat Mar 27, 2010 13:30
    —
Volniy wrote:
поможет классика - редактирование реестра
Но поможет она только тем, кто пойдёт на подмену кодовых страниц. А вот, если не править реестр, то получается, что с приходом юникодного TC ситуация с русским усугубилась: с тем же скриптом в версии 7.04a проблемы "невыделения" файлов с русскими именами нет.
Volniy wrote:
Пока не знаю, что с этим делать.
Может можно что-нибудь придумать?

#160:  Author: VolniyLocation: Местный PostPosted: Sat Mar 27, 2010 14:06
    —
Tol!k wrote:
Volniy, а почему не помогает пауза? Даже TCS.Pause = 1000

Видимо потому что пауза эта создается перед исполнением команды. Если же нужна явная задержка, с beta11 уже можно использовать
Code:
TCS.Sleep 1000


Кстати, предложенный мной вариант у меня стабильно работает. В 3-ей зебре после команды выделения есть макрос TCS.GetSrcPath , который является набором нескольких команд. Это дает дополнительную задержку, я думаю.

Я исправил немного код скрипта, чтобы сообщение в конце его работы ("радостно") показывало реальное число выделенных файлов.

#161:  Author: Tol!kLocation: Арзамас PostPosted: Sat Mar 27, 2010 14:55
    —
Volniy wrote:
Видимо потому что пауза эта создается перед исполнением команды
Не понимаю, в чём разница: перед и между
Code:
TCS.Pause = 1000
TCS.SendCommand "cm_SelectAll", False
TCS.SendCommand "cm_CopyFullNamesToClip", False
Судя по неспешному выполнению, пауза есть. Но она "не такая", бесполезная

#162:  Author: Tol!kLocation: Арзамас PostPosted: Sat Mar 27, 2010 15:18
    —
Кажется начинаю понимать, пауза нужна _после_ cm_CopyFullNamesToClip
Но почему TCS.Pause=1000 не действует на следующую команду List=Split(TCS.GetTextFromClip,vbNewLine) ?
Вернее, действует но не помогает

#163:  Author: VolniyLocation: Местный PostPosted: Sat Mar 27, 2010 23:10
    —
Я все-таки думаю, что проблема именно а в том, что не успевает выполнится команда выделения всех файлов, а не копирования имен в буфер. Тоесть пауза нужна после команды "cm_SelectAll" . Попробуй все-таки тут вставить TCS.Sleep.

Еще раз про разницу между TCS.Pause и TCS.Sleep.
TCS.Sleep - это одноразовая команда, останавливающая исполнение скрипта на указанный в милисекундах промежуток времени
TCS.Pause - это свойство самого хелпера. Соответственно его величина (по-умолчанию = 70) задается для всего скрипта, в котором используется хелпер и влияет только на выполняемые им команды. Задержка происходит перед непосредственным выполнением команды.
Pause, насколько я помню, было когда-то введено для более четкого срабатывания некоторых команд. На сегодняшний день (особенно после добавления TCS.Sleep) я уже сомневаюсь в необходимости этого свойства объекта Helper

PS Попробовал сейчас прямую работу с Буфером обмена (а была она реализована через движок VB). Так вот, если я напрямую устанавливаю данные для Unicode формата - проблемы с выделением русских имен файлов пропадают. Но при этом содержимое текстового формата - мусорное (винда сама производит конвертацию). Может мне для TCS.SetTextToClip стоит добавить опциональный параметр для работы именно с Unicode текстом?

#164:  Author: sa PostPosted: Sun Mar 28, 2010 00:21
    —
Volniy wrote:
Может мне для TCS.SetTextToClip стоит добавить опциональный параметр для работы именно с Unicode текстом?

Мне кажется, что такой параметр пригодился бы многим.
PS А вот в команде TCS.SendKeystroke проблем с юникодной версией TC, по-моему, стало наоборот меньше, чем раньше: из четырёх возможных сочетаний, неверно отрабатывается только вариант английского текста при русской раскладке клавиатуры.

#165:  Author: Tol!kLocation: Арзамас PostPosted: Sun Mar 28, 2010 11:23
    —
Volniy wrote:
Я все-таки думаю, что проблема именно а в том, что не успевает выполнится команда выделения всех файлов, а не копирования имен в буфер. Тоесть пауза нужна после команды "cm_SelectAll" . Попробуй все-таки тут вставить TCS.Sleep.
Пробовал. В моём случае правильно работает только так:
Code:
TCS.SendCommand "cm_SelectAll", False
TCS.SendCommand "cm_CopyFullNamesToClip", False
TCS.Sleep 1000

Volniy wrote:
TCS.Pause - это свойство самого хелпера …и влияет только на выполняемые им команды.
Т.е. в следующей строке List=Split(TCS.GetTextFromClip,vbNewLine) TCS.Pause=1000 не влияет на Split (но влияет на TCS.GetTextFromClip) ?
Это бы всё объясняло.

#166:  Author: VolniyLocation: Местный PostPosted: Wed Mar 31, 2010 03:06
    —
Tol!k wrote:
Т.е. в следующей строке List=Split(TCS.GetTextFromClip,vbNewLine) TCS.Pause=1000 не влияет на Split (но влияет на TCS.GetTextFromClip) ?

На Split, конечно же, не влияет. Ибо не мое. А вот на TCS.GetTextFromClip должно бы по идее влиять, но... не влияет. Я тут просмотрел свой код и обнаружил ошибочку: пауза в этом методе вызывалась только в случае повторного (после неудачного) доступа к буферу обмена, а значит практически никогда. Надо пересмотреть и другие места, где есть влияние свойства Pause и, наверное, все-таки установить вызов этой задержки после выполнения команды, это сейчас мне кажется более логичным.

ЗЫ А Sleep на одну секунду, это не слишком?

#167:  Author: Tol!kLocation: Арзамас PostPosted: Wed Mar 31, 2010 06:26
    —
Volniy wrote:
на одну секунду, это не слишком?
Да это только для экспериментального выяснения, где-же там нужна задержка.

#168:  Author: AgereS PostPosted: Thu Apr 01, 2010 10:49
    —
а можно выложить готовый результат с вашими корректировками которые обсуждали
а то честно говоря я уже запутался Sad

#169:  Author: VolniyLocation: Местный PostPosted: Thu Apr 01, 2010 15:12
    —
Так ведь нет еще полностью готового-то. Рассуждаем мы покамест. Как лично для меня, так последний Зебра-3, он вполне рабочий, не считая проблемы с неанглийскими именами файлов. Да и та уже решена, только мне нужно выложить слегка откорректированный файл хелпера. Может сегодня вечером выложу, если успею.

#170:  Author: Tol!kLocation: Арзамас PostPosted: Thu Apr 01, 2010 17:00
    —
AgereS
Quote:
лично для меня, так последний Зебра-3, он вполне рабочий, не считая проблемы с неанглийскими именами файлов
Для меня полностью рабочий, проблемы с неанглийскими именами у меня нет.

#171:  Author: sa PostPosted: Thu Apr 01, 2010 17:15
    —
Tol!k wrote:
проблемы с неанглийскими именами у меня нет

Правленый реестр?
Code:
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage]
"1252"="c_1251.nls"

#172:  Author: Tol!kLocation: Арзамас PostPosted: Thu Apr 01, 2010 19:08
    —
sa wrote:
Правленый реестр?
Да.

#173:  Author: aLexxLocation: Новокузнецк PostPosted: Sat Apr 03, 2010 03:03
    —
Что-то в скрипте "Зебра-3" не совсем понял, для чего введена переменная CurDir?
Вижу, что присваивается, но где используется?

#174:  Author: VolniyLocation: Местный PostPosted: Sat Apr 03, 2010 03:10
    —
Для получения относительных путей вместо полных:
Code:
Buf = Buf & Mid(List(Cnt), Len(CurDir) +2) & vbNewLine

Банально для вычисления сколько символов в начале пути нужно отсечь.

#175:  Author: aLexxLocation: Новокузнецк PostPosted: Sat Apr 03, 2010 03:18
    —
Дак а в самом скрипте строка:
Code:
      Buf = Buf & List(Cnt) & vbNewLine


Надо исправить?!

#176:  Author: VolniyLocation: Местный PostPosted: Sat Apr 03, 2010 03:31
    —
Ты куда смотришь-то? На предыдущей странице скрипт, из которого я эту строку только что и скопировал. У тебя какой-то старый вариант, наверное. Видимо тот, который еще не работал с BranchView.

#177:  Author: aLexxLocation: Новокузнецк PostPosted: Sat Apr 03, 2010 03:43
    —
Блин, счас глянул, всё правильно... Видать, и вправду, не обновилась страничка.
Прошу пардона!

#178:  Author: VolniyLocation: Местный PostPosted: Sat Apr 03, 2010 04:55
    —
Вот и обещанный ранее файл с изменениями, сделанными для нормальной работы с русскими именами файлов в Буфере обмена
tcwshelp_b11Plus.rar
Реализовано принудительным заданием локали в Буфере обмена. Можно было бы, конечно, зафиксировать ее на 1049 (Russian), но на всякий ("интернациональный") случай сделал иначе - с помощью дополнительного необязательного параметра.
Quote:
SetTextToClip(Text,[LCID]) помещает Text в буфер обмена Windows, LCID - идентификатор локали для конвертации в Unicode, по умолчанию подставляется системный (GetSystemDefaultLCID)

Тоесть скорее всего сейчас будет работать и без этого дополнительного параметра, но если нет - попробуйте подставить туда 1049
Code:
SetTextToClip("c:\папка\файл.ext",1049)

#179:  Author: aLexxLocation: Новокузнецк PostPosted: Sat Apr 03, 2010 05:02
    —
А без регистрации можно скачать???

#180:  Author: AvadaLocation: Россия, Саратов PostPosted: Sat Apr 03, 2010 09:14
    —
aLexx
У меня скачивается без всякой регистрации. Проверено в IE и в Опере.

#181:  Author: Tol!kLocation: Арзамас PostPosted: Sat Apr 03, 2010 09:18
    —
Quote:
А без регистрации можно скачать???

aLexx, конечно!

#182:  Author: AgereS PostPosted: Sat Apr 03, 2010 10:52
    —
Всё отлично работает большое спасибо

#183:  Author: sa PostPosted: Sat Apr 03, 2010 11:08
    —
Volniy wrote:
Тоесть скорее всего сейчас будет работать и без этого дополнительного параметра

Работает! Многие скрипты обрели вторую жизнь. Спасибо!

PS А по SendKeystroke совсем никаких планов? Нам только палец в рот положи...

#184:  Author: sa PostPosted: Mon Apr 05, 2010 15:52
    —
sa wrote:
А вот в команде TCS.SendKeystroke проблем с юникодной версией TC, по-моему, стало наоборот меньше, чем раньше: из четырёх возможных сочетаний, неверно отрабатывается только вариант английского текста при русской раскладке клавиатуры.

Поэтому для гарантии правильной работы SendKeystroke достаточно перейти к английской раскладке. У меня этот переход настроен в региональных стандартах на Ctrl+Shift+1 и команда перехода к английской раскладке в скриптах выглядит следующим образом:
Code:
TCS.SendKeystroke "^+1"

#185:  Author: sa PostPosted: Tue Apr 13, 2010 14:50
    —
Возникли проблемы с последней версией tcwshelp_b11Plus.
Кажется, что поведение зависит от объёма данных при копировании в буфер.
Например, можно попробовать "натравить" последнюю зебру (ZebraMark-3.vbs) на папку Windows, к которой предварительно применить Ctrl+B. Верный результат получается у кого-нибудь?

#186:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Apr 14, 2010 09:46
    —
На машине установлена Windows 7 Масимальная x32.
Пытаюсь зарегистрировать TCWSHelp. Получаю:
Quote:
---------------------------
Ошибка
---------------------------
Unexpected error; quitting
---------------------------
ОК
---------------------------

Пробовал несколько версий. Везде то же самое.
tcwshelp_b10+.rar
tcwshelp_b11.rar
tcwshelp_b11Plus.rar

При этом TCWSHelp.exe /UNREGSERVER отрабатывает тихо без ошибок.

#187:  Author: RodnyLocation: Могилёв, Беларусь PostPosted: Wed Apr 14, 2010 20:35
    —
Batya
У меня из tcwshelp_b11Plus.rar нормально зарегистрировался в такой же системе.

#188:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Apr 15, 2010 09:24
    —
Может у меня каких-то библиотек не хватает Question
Volniy, откликнись!

#189:  Author: VolniyLocation: Местный PostPosted: Fri Apr 16, 2010 02:02
    —
Batya wrote:
Может у меня каких-то библиотек не хватает Question
Volniy, откликнись!

Ау, я тута Smile
Порекомендую, конечно же, (пере)установить рантаймы VB6 (а раньше нужны были VB5), никаких специальных библиотек я не использовал. Рантаймы найти легко, вот весьма популярная ссылочка.

А вообще регистрация ActiveX сервера всегда сопровождается записью в реестр, причем именно в HKLM, а на такое дело еще и соответствующие права должно иметь. Проверь это дело.

sa wrote:
Кажется, что поведение зависит от объёма данных при копировании в буфер.

Подтверждаю. Не заметил раньше, потому что на больших количествах файлов попросту не пробовал. Ограничение возникает на объеме буфера около 32 кб. Тут я сам виноват - с панталыку неверно указал тип переменной для хранения размера буфера. Исправим, не проблема.

#190:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Apr 16, 2010 15:03
    —
Volniy wrote:
Порекомендую, конечно же, (пере)установить рантаймы VB6

Переустановил. То же самое ...

Volniy wrote:
А вообще регистрация ActiveX сервера всегда сопровождается записью в реестр, причем именно в HKLM, а на такое дело еще и соответствующие права должно иметь. Проверь это дело.

... А потом выполнил через "Запуск от имени администратора". Заработало.
О как! А я думал, что, если я администратор на машине, то всё могу по определению - привык на прошлых виндах Confused Теперь надо привыкать к определённой специфике Win 7.

Volniy
А можно, если будет время, сделать, чтобы при недостатке прав было какое-нибудь вразумительное сообщение, а не "Unexpected error"?

#191:  Author: VolniyLocation: Местный PostPosted: Sat Apr 17, 2010 02:04
    —
Batya wrote:
Volniy

А можно, если будет время, сделать, чтобы при недостатке прав было какое-нибудь вразумительное сообщение, а не "Unexpected error"?

Не-а, не смогу сделать, сколько бы времени у меня ни было. Дело в том, что регистрация ActiveX сервера это процесс не контролируемый из кода, то есть это сообщение об ошибке происходит еще до передачи управления.

Можно поиграться с заданием уровня прав в манифесте, затребовав административных, но тогда скорее всего пользователь с ограничениями вообще не сможет пользоваться сервером. Есть еще один вариант. Необходимые для регистрации данные могут быть занесены в реестр только для текущего пользователя (в HKCU), на что прав нужно по менее. Для этого можно написать простой рег-файлик.

#192:  Author: Andrey_ALocation: Сочи PostPosted: Sun Apr 25, 2010 22:31
    —
Подскажите что это за ощибка и как её истравить:
Code:
...
Строка:   2
Символ:   1
Ошибка:   0x800700C1
Код:   800700C1
Источник:    (null)

Часть cкриптов vbs работает, но там, где есть строка
Set TCS = CreateObject("TCSCRIPT.Helper") - выдаётся ошибка, хотя Helper нормально зарегистрировался. Систему только поставил - Vista 32

#193:  Author: sa PostPosted: Sun Apr 25, 2010 23:51
    —
Andrey_A wrote:
хотя Helper нормально зарегистрировался

Путь до Helper-а уже после регистрации случайно не менялся?

#194:  Author: Andrey_ALocation: Сочи PostPosted: Tue Apr 27, 2010 05:25
    —
Путь до Helper-а уже после регистрации не менялся
Я установил паралельно Win7 - тоже самое. Все скрипты работают, кроме этого. Проверял разные версии Helper-а - ошибка, хотя до этого тоже стояла таже самая Vista - никаких не было проблем. Как будто не хватает чего-то, что было раньше

#195:  Author: sa PostPosted: Tue Apr 27, 2010 07:28
    —
Andrey_A wrote:
Как будто не хватает чего-то, что было раньше

Может вот эти рекомендации Volniy пригодятся?

#196:  Author: Andrey_ALocation: Сочи PostPosted: Tue Apr 27, 2010 13:47
    —
Вопрос разрешился как-то загадочно, я сам ничего не понял. Может кто-сталкивался. При установки 3-х систем Тотал оставался на месте, т.е. я его не устанавливаю, а просто копирую (в данном случае он просто был на диске с:\Total...) И во всех трёх системах происходила одна и та же ошибка. Я стал логически размышлять, а что общего между этими системами??? Прищёл к выводу - это, возможно оставшиеся файлы на диске с:\... Я посмотрел - какие-то непонятные 4 файла (Один из них, был толи tc.wc?, толи wc.tc? - откуда он взялся я не знаю). При их удалении всё заработало!!! Установки дополнительных библиотек, что только я не делал - ничего не помогало. А вот удаление - и всё OK. Как будто файл хранил какую-то информацию, блокирующую работу скрипта.

#197:  Author: Andrey_ALocation: Сочи PostPosted: Sun May 09, 2010 16:25
    —
Пользуюсь скриптами с использованием Helperа - очень нравится. Недавно заметил, что скрипт, который постоянно работал, отказывался срабатывать. После долгих мучений понял что если путь или имя содержит определённые знаки, то ничего не просходит. Пример: если целевой каталог %COMMANDER_PATH%\+++\ , то команда TCS.SendKeystroke (Line) отказывается вписывать строку Line = TCS.GetTrgPath . Тестировал все имеющиеся скрипты, выяснилось и другое. Вот простой скрипт:
Code:
' Создание папки в соседней панели с именем файла\папки под курсором
' Параметр "%O"
Dim TCS
    Set TCS = CreateObject("TCSCRIPT.Helper")
    Name  = WScript.Arguments(0)
    Line = TCS.GetTrgPath & "\" & Name
    TCS.SendCommand "cm_MkDir"
    TCS.Pause = 200
    TCS.SendKeystroke (Line)
Set TCS = Nothing


Создайте файл Маша+Вася.txt - и пусть он будет под курсором ("+" пропадает) итог МашаПетя. А фал Маша++Вася.txt - срабатывает нормально

Маша%Вася.txt итог Машаася
Маша~Петя.txt вообще что-то непонятное
С папками обстоит дело, по-другому, но тоже..?! Cоздайте на С диске папки +, ++, +++, %, %% , %%%, ^^^ а в другой панели файл NAME.txt и поочерёдно в каждой из них создайте скриптом папку именем Name (под курсором будет файл NAME.txt)
+ итог c:\/Name а должно быть c:\+\Name
++ итог Name а должно быть c:\++\Name
...
% итог c:\Name а должно быть c:\%\Name
%% итог Name а должно быть c:\%%\Name
...
^ итог c:\Name а должно быть c:\^\Name
^^ итог Name а должно быть c:\^^\Name
...
{123} итог Name а должно быть c:\{123}\Name

Другие символы я не проверял, время не было...

#198:  Author: VolniyLocation: Местный PostPosted: Sun May 09, 2010 22:09
    —
Quote:
Символы плюс (+), "крышка" (^), знак процентов (%), тильда (~) и круглые скобки ( ) имеют специальное значение. Чтобы указать передачу одного из этих символов, следует заключить его в фигурные скобки ({}). Например, знаку плюс соответствует код {+}... Фигурным скобкам соответствуют коды {{} и {}}

Это фрагмент из прилагаемого к хелперу файла "SendKeystroke.txt". Это не я придумал, это копипаст из MS документации по VB-шному методу SendKeys, который и используется в хелпере (правда, с некоторыми несущественными дополнениями и переработками). Так что эту особенность тут как-то следует учитывать.
Что касается данного конкретного случая, то я бы предпочел вообще не использовать Тотал для создания новой папки. Для этого у WSH хватает и своих методов. Например, можно вот так:
Code:
Dim TCS, fso, Line
Set TCS = CreateObject("TCSCRIPT.Helper")
Set fso = CreateObject("scripting.filesystemobject")

Line = TCS.GetTrgPath & "\" & WScript.Arguments(0) 
If fso.FolderExists(Line) = False Then fso.CreateFolder(Line)

Set TCS = Nothing
Set fso = Nothing

#199:  Author: Tol!kLocation: Арзамас PostPosted: Sun May 09, 2010 23:19
    —
Volniy wrote:
Что касается данного конкретного случая, то я бы предпочел вообще не использовать Тотал для создания новой папки.

В данном случае можно обойтись без хелпера. Например, на VBS, можно так:
Code:
' Создание папки в соседней панели с именем файла\папки под курсором
' Параметры: "%T%O"
Dim TCS, fso, Line
Set fso = CreateObject("scripting.filesystemobject")

Line = WScript.Arguments(0)
If fso.FolderExists(Line) = False Then fso.CreateFolder(Line)

Set fso = Nothing


На batch`e можно обойтись одной только кнопкой. Например так:
Code:
TOTALCMD#BAR#DATA
%ComSpec% /c md
"%T%O"
WCMICONS.DLL,29
Создание папки в соседней панели с именем файла\папки под курсором

1
-1

#200:  Author: Andrey_ALocation: Сочи PostPosted: Mon May 10, 2010 13:57
    —
Спасибо за советы, но речь шла не о конкретном скрипте, у меня десятка два скриптов, в которых используется путь или имя под курсором, и все они в папках(++, +++) не срабатывают. Есть три варианта
1. Исправить их и Helper не использовать
2. Подправить автором как-то программу, где при команде TCS.GetTrgPath или подобной пути, имена, имеющие спец знаки читались не посимвольно, а целой строкой
3. Сделать универсальный кусок скрипта, который бы проверял имя, путь на наличие в нём спец знаков и вставлял {} вокруг них, пример
путь c:\+++\ превращался бы в c:\{+}{+}{+}\, если кто может в этом помочь помогите пожалуйста, не хотелось отказываться от Helpera

#201:  Author: VolniyLocation: Местный PostPosted: Fri May 14, 2010 02:36
    —
Andrey_A wrote:
3. Сделать универсальный кусок скрипта, который бы проверял имя, путь на наличие в нём спец знаков и вставлял {} вокруг них, пример
путь c:\+++\ превращался бы в c:\{+}{+}{+}\, если кто может в этом помочь помогите пожалуйста, не хотелось отказываться от Helpera


Code:
MsgBox ValidPath("c:\+++\^^\%%")

Function ValidPath(Path )
  For i=1 To Len(Path)
    s=Mid(Path,i,1)
    Select Case s
      Case "(",")","{","}","+","%","^","~"
        s="{" & s & "}"
    End Select
    ValidPath=ValidPath & s
  Next
End Function


PS И сдался вам этот хелпер...

#202:  Author: FlasherLocation: Москва PostPosted: Tue Aug 17, 2010 15:41
    —
Имеем WSH.ExpandEnvironmentStrings("%TEMP%")
Предположим, путь в переменной среды сопоставлен с C:\DOCUME~1\USERNAME\LOCALS~1\Temp.
Есть ли возможность перевести путь формата 8.3 в полный?

#203:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Aug 18, 2010 11:53
    —
Flasher wrote:
Есть ли возможность перевести путь формата 8.3 в полный?

Примерно так:
Code:
FolderPath = "C:\DOCUME~1\Default\LOCALS~1\Temp"
MsgBox CreateObject("Shell.Application").NameSpace(FolderPath).Self.Path

#204:  Author: FlasherLocation: Москва PostPosted: Wed Aug 18, 2010 12:43
    —
Batya
Благодарю, то, что надо! Smile
Code:
Set SA = CreateObject("Shell.Application")
TMP = WSH.ExpandEnvironmentStrings("%TEMP%")
Path = SA.NameSpace(TMP).Self.Path

#205:  Author: FlasherLocation: Москва PostPosted: Fri Oct 01, 2010 03:59
    —
Ищу мягкий метод, который позволит менять местами выделенные файлы и папки в панелях с учётом совпадения некоторых по маске (без переименования), а также всё содержимое этих панелей. Пока безрезультатно. Кто-нибудь может подсказать, куда смотреть?

#206:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Oct 01, 2010 14:20
    —
Flasher
Если имена совпадают, думаю, что без переноса в промежуточный каталог или предварительного переименования не обойтись.

#207:  Author: FlasherLocation: Москва PostPosted: Fri Oct 01, 2010 14:23
    —
Batya
Ну если тебе такие чудеса не известны, то придётся клепать с тем, что есть. Кстати, буду рад подключению, если времечко имеется. Wink

#208:  Author: Andrey_ALocation: Сочи PostPosted: Wed Oct 06, 2010 02:41
    —
В Helper есть функция SetTextToClip(Text) - отправить текст в буфер обмена. Есть ли возможность отправлять в буфер текст чем либо ещё в скриптовом формате? Дело в том, что при большом куске текста, эта функция не срабатывает.

#209:  Author: FlasherLocation: Москва PostPosted: Wed Oct 06, 2010 04:39
    —
Если из файла, то объект FileSystemObject > объект TextStream > метод ReadAll

А тут описывается способ при наличии IE в системе.

#210:  Author: Andrey_ALocation: Сочи PostPosted: Wed Oct 06, 2010 06:33
    —
с FileSystemObject > объект TextStream > метод ReadAll у меня проблем нет. Я это уже освоил, но вот с IE наверно проблемы. Ниже описанный код, сохраненный в vbs - не работает. Нажимаю, что-то вроде бы происходит, но в буфер ничего не копируется!?
Code:
'Копирование текста в буфер обмена
strCopy = "Этот текст будет скопирован в буфера обмена"
Set objIE = CreateObject("InternetExplorer.Application")
objIE.Navigate("about:blank")
objIE.document.parentWindow.clipboardData.setData "text", strCopy
objIE.Quit

#211:  Author: sa PostPosted: Wed Oct 06, 2010 07:36
    —
Andrey_A wrote:
В Helper есть функция SetTextToClip(Text) - отправить текст в буфер обмена.... при большом куске текста, эта функция не срабатывает.
В апреле этого года Volniy собирался это поведение исправить:
Volniy wrote:
Подтверждаю. Не заметил раньше, потому что на больших количествах файлов попросту не пробовал. Ограничение возникает на объеме буфера около 32 кб. Тут я сам виноват - с панталыку неверно указал тип переменной для хранения размера буфера. Исправим, не проблема.

#212:  Author: FlasherLocation: Москва PostPosted: Wed Oct 06, 2010 09:50
    —
Andrey_A wrote:
Ниже описанный код, сохраненный в vbs - не работает.
Что-то с настройками безопасности IE. Ты у нас по методам тыка спец, найдёшь брешь - доложи, если не трудно. Wink

Есть ещё пару вот таких интересных штучек(требуют установки и реги библиотек): 1, 2.
2-я, кстати, ещё и ini-шники править умеет (это к недавнему P.S. Samwatas).

#213:  Author: Samwatas PostPosted: Wed Oct 06, 2010 13:20
    —
Quote:
Есть ещё пару вот таких интересных штучек(требуют установки и реги библиотек)
- о портативности, как я понимаю, не стоит даже и заикаться?

#214:  Author: FlasherLocation: Москва PostPosted: Wed Oct 06, 2010 13:25
    —
Может речь о портабельности, а не портативности? Если да, то при желании можно в скрипте регистрировать библиотеку, и поставить на проверку для следующих запусков. Будет почти аналогия.

#215:  Author: VolniyLocation: Местный PostPosted: Sun Oct 17, 2010 15:37
    —
Script Helper ActiveX for TC beta12
Скачать файл: http://wincmd.ru/download.php?id=script_helper

Исправлены баги: 1) ограниченный до 32 кб размер помещаемого в Буфер обмена текста, 2) ошибка (Несоответствие типа) при вызове методов SetSrcPath и SetTrgPath, если в качестве параметра передавалась переменная, а не просто строка.

Для указания нескольких нажатий клавиши пробела теперь можно использовать синтаксис {SPACE x} или {SP xx} (одиночный пробел {SPACE} или {SP}). Сделано для лучшей читаемости скриптов.

Добавлены Англоязычные доки (спасибо Lev)

PS Пример использования SetSrcPath для выделения файла в панели - http://forum.wincmd.ru/viewpost.php?p=68875

#216:  Author: sa PostPosted: Sun Oct 17, 2010 16:28
    —
Volniy wrote:
Исправлены баги: 1) ограниченный до 32 кб размер помещаемого в Буфер обмена текста

Проверил: зебра (ZebraMark-3.vbs) для папки Windows, к которой предварительно применён Ctrl+B (больше 9000 файлов), теперь выдаёт верный результат. Спасибо за обновление!

#217:  Author: FlasherLocation: Москва PostPosted: Sun Oct 17, 2010 20:12
    —
Volniy
Что-то у меня SetTrgPath перестал устанавливать курсор в другой панели и выделять файл, и после него не работает SendKeyStore.
Добавлено: похоже SetTrgPath ни при чём, через WSH.Run то же самое.. Sad

#218:  Author: FlasherLocation: Москва PostPosted: Tue Nov 23, 2010 07:53
    —
Нужна такая вещь: задаём список
Set List = CreateObject("Scripting.Dictionary")
List.Add "бла", ""
List.Add "блабла", ""
List.Add "блаблабла", ""
......
Сравниваем значение ранее заданной переменной со всеми элементами списка. Если один из этих элементов совпал, то используем найденное значение из списка в каком-нибудь последующем методе. Как правильно записать?


Last edited by Flasher on Tue Nov 23, 2010 16:12; edited 1 time in total

#219:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Nov 23, 2010 15:54
    —
Flasher
Каждый элемент ассоциированного массива "Scripting.Dictionary" имеет ключ и значение.
Для добавления элемента к массиву используется метод Add:
Code:
Set List = CreateObject("Scripting.Dictionary")
List.Add Key1, Value1
List.Add Key2, Value2

Поэтому запись "EXT.List "бла", """ мне совершенно непонятна.
Если необходимо найти значение элемента массива по ключу, который содержится в некой переменной, то используются конструкции вида:
Code:
MyVar = "бла"
Set List = CreateObject("Scripting.Dictionary")
List.Add "бла"   , "Значение 1"
List.Add "блабла", "Значение 2"
If List.Exists(MyVar) Then
  MsgBox "По ключу """ & MyVar & """ найдено значение """ & List(MyVar) & """"
Else
  MsgBox "По ключу """ & MyVar & """ ничего не найдено"
End If

Здесь List(MyVar) возвращает значение элемента ассоциированного массива List по ключу MyVar.

#220:  Author: FlasherLocation: Москва PostPosted: Tue Nov 23, 2010 16:17
    —
Batya wrote:
Поэтому запись "EXT.List "бла", """ мне совершенно непонятна.
Пардон, поправил. В темпе делал, не ту часть поменял.
Batya wrote:
Здесь List(MyVar) возвращает значение элемента ассоциированного массива List по ключу MyVar.
Хм. Довольно просто. А я в цикл пихал то же самое, откуда глюки и возникли. Только мне не нужно искать значение ключа, мне нужно искать сам ключ, совпадающий со значением переменной, поэтому я и ставлю пустые значения "".

#221:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Nov 23, 2010 16:57
    —
Flasher wrote:
Только мне не нужно искать значение ключа, мне нужно искать сам ключ, совпадающий со значением переменной

Code:
If List.Exists(MyVar) Then MsgBox MyVar

#222:  Author: FlasherLocation: Москва PostPosted: Tue Nov 23, 2010 17:13
    —
Это не то. Я же написал
Flasher wrote:
то используем найденное значение из списка в каком-нибудь последующем методе
Т.е., если перефразировать, то - найденный ключ, но вовсе не значение переменной.
Хотя это даёт один и тот же результат, всё-таки хотелось бы узнать, каким способом выдернуть этот найденный ключ? Это нужно в случае, когда из этого ключа будет браться только его синтаксический кусок, в то время как из значения переменной его выделить не получится.

#223:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Nov 23, 2010 23:24
    —
Flasher
Ничего не понял. А можно более предметно описать задачу?

#224:  Author: FlasherLocation: Москва PostPosted: Tue Nov 23, 2010 23:35
    —
Ну, не знаю, к примеру:
Code:
D = "D:\"
C = "C:\"
Set List = CreateObject("Scripting.Dictionary")
List.Add  WScript.Arguments(0), ""
List.Add  WScript.Arguments(1), ""
If List.Exists(D) And List.Exists(C) Then MsgBox (Найденный ключ аля C) & vbnewline & (Найденный ключ аля D)

#225:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Nov 24, 2010 12:47
    —
Flasher
Опять не понял. Что значит "Найденный ключ аля C", если C - это и есть ключ?
Итак, есть массив. Т.к. в массиве заданы только ключи, то можно сказать, что это список ключей.
Проверяем, есть ли некоторый ключ в этом списке.
Дальше что?

#226:  Author: FlasherLocation: Москва PostPosted: Wed Nov 24, 2010 13:02
    —
Batya
А дальше, если ключ найден, то используем его в следующем методе.

Я в принципе вчера разобрался, что делать со значением переменной, чтобы выдёргивать нужный кусок. Конструкция Left("блабла", Len("блабла"-x). Но хотелось бы узнать именно, как работать с найденным ключём.

#227:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Nov 24, 2010 14:17
    —
Flasher wrote:
А дальше, если ключ найден, то используем его в следующем методе.

И в чём здесь проблема?

Flasher wrote:
Но хотелось бы узнать именно, как работать с найденным ключём.

Как угодно.
Можно, например, вывести его на экран Wink

Flasher wrote:
Left("блабла", Len("блабла")-x)

Здесь пропустил скобку.

#228:  Author: FlasherLocation: Москва PostPosted: Wed Nov 24, 2010 14:21
    —
Batya wrote:
И в чём здесь проблема?
Можно, например, вывести его на экран
Ну и как его вывести? Как вообще указывать найденное в дальнейших методах?

#229:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Nov 24, 2010 14:35
    —
Погоди, ты ничего не путаешь?
Элемент массива существует только при точном соответствии по ключу.
Т.е. здесь
Code:
A = "C:\"
B = "C:\1\1"
C = "C:\"
D = "C:\1"
E = "C:\2"
Set List = CreateObject("Scripting.Dictionary")
List.Add  A, ""
List.Add  B, ""
MsgBox List.Exists(C)
MsgBox List.Exists(D)
MsgBox List.Exists(E)

"Истина" будет выведена только в первом случае, в остальных двух - "Ложь".

Flasher wrote:
Как вообще указывать найденное в дальнейших методах?

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

#230:  Author: FlasherLocation: Москва PostPosted: Wed Nov 24, 2010 14:52
    —
Batya wrote:
Погоди, ты ничего не путаешь?
Элемент массива существует только при точном соответствии по ключу.
Ну это логично. А что я путаю?
Batya wrote:
В итоге, если найден элемент по переменной, используемой как ключ, то тебе и нужно дальше обрабатывать эту переменную.
Это я ещё вчера понял отсюда и реализовал. Просто я думал, что найденный элемент массива тоже можно как-то обрабатывать, а не только значение переменной, с которых совпал элемент массива.

#231:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Nov 24, 2010 16:00
    —
Flasher wrote:
Просто я думал, что найденный элемент массива тоже можно как-то обрабатывать, а не только значение переменной, с которых совпал элемент массива.

Не сваливай понятия в одну кучу.
Элемент массива - это сущность, которая обусловлена ключом и значением.
У элемента массива можно поменять как значение, так и ключ.
Если ты нашёл элемент массива по ключу, хранящемуся в переменной, то ты можешь обратиться к найденному элементу именно по этому ключу.

Короче, не надо абстракций.
Опиши конкретную задачу.

#232:  Author: FlasherLocation: Москва PostPosted: Fri Nov 26, 2010 06:33
    —
Batya
Упрёк понятен. Как ты уже, наверно, понял, скрипт с реализацией тут.
Вот поясни конкретно, что имеется в виду под "ты можешь обратиться к найденному элементу именно по этому ключу"? Т.е. ровно как было предписано изначально?
Тогда у меня другой вопрос: можно ли задавать значения в массиве в виде объектов/методов, а не текста, а потом обращаться к найденным значениям по соответствующим им ключам? Если да, то как это будет выглядеть?

#233:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Nov 26, 2010 11:29
    —
Flasher
Честно говоря, пока нет времени понять твою логику с кучей If-ов. Позже разберусь.
Пока только немного упростил твой скрипт:
Code:
' Reload TC with return to different directories types
' and open archives
' Requirements: Script Helper ActiveX for TC by Volniy
' Parameters: "%X%P%Z" "%T"
' Flasher (c)
'=================================
LP = WScript.Arguments(0)
RP = WScript.Arguments(1)

With CreateObject("TCScript.Helper")
  .SendCommand "cm_ConfigSaveDirHistory"
  L = Replace(.INIRead(.MainINI,  "LeftHistory",  "0",  ""), "/", "\")
  R = Replace(.INIRead(.MainINI,  "RightHistory",  "0",  ""), "/", "\")
  .SendCommand "cm_Exit", True
End With

LM = Left(L, Len(L)-(Len(LP)-1))
RM = Left(R, Len(R)-(Len(RP)-1))

Dim ListL, ListR, NameArr, N, Param, TCexe
Set ListL = CreateObject("Scripting.Dictionary")
Set ListR = CreateObject("Scripting.Dictionary")
NameArr   = Array(&Ha, &H3, &H4, &H11, &H12)

With CreateObject("Shell.Application")
  For Each N In NameArr
    ListL.Add .NameSpace(N).Self.Path & "|" & LP , ""
    ListR.Add .NameSpace(N).Self.Path & "|" & RP , ""
  Next
End With

If L="::|"&LP And ListR.Exists(R) Then
  Param = "/L=""" & L  & """ /R=""" & RM & """"
ElseIf ListL.Exists(L) And R="::|"&RP Then
  Param = "/L=""" & LM & """ /R=""" & R  & """"
ElseIf ListL.Exists(L) And ListR.Exists(R) Then
  Param = "/L=""" & LM & """ /R=""" & RM & """"
ElseIf ListL.Exists(L) Then
  Param = "/R=""" & R  & """ /L=""" & LM & """"
ElseIf ListR.Exists(R) Then
  Param = "/L=""" & L  & """ /R=""" & RM & """"
Else
  Param = "/L=""" & L  & """ /R=""" & R  & """"
End If

TCexe = "%Commander_Path%\totalcmd.exe"
With CreateObject("WScript.Shell")
  .Run """" & .ExpandEnvironmentStrings(TCexe) & """ " & Param, 0
End With

WScript.Quit


Flasher wrote:
можно ли задавать значения в массиве в виде объектов/методов, а не текста, а потом обращаться к найденным значениям по соответствующим им ключам?

Значения ассоциированного массива могут быть любыми - и объектами, и другими массивами. Ключи же - не знаю, не пробовал.

#234:  Author: FlasherLocation: Москва PostPosted: Fri Nov 26, 2010 11:43
    —
Batya
А я ведь Arrow никогда не пользовался. Удобная функция. Спасибо! Теперь почаще буду смотреть в "Прочие функции". Про то, чтобы впихнуть всё в одну переменную сразу что-то не подумал. Логично ведь. Smile
Не против, если я там свой скрипт заменю на переделанный?
Добавлено: ладно, я там просто ссылку на твой пост добавлю.

Batya wrote:
Ключи же - не знаю, не пробовал.
Про ключи-то я и не спрашиваю, как ты мог заметить, они в данном скрипте являются объектами. Wink

#235:  Author: VolniyLocation: Местный PostPosted: Fri Nov 26, 2010 12:27
    —
Quote:
The key is used to retrieve an individual item and is usually a integer or a string, but can be anything except an array.

Ключ (обычно это целочисленная переменная или строка) может быть чем угодно, кроме массива.

#236:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Nov 26, 2010 12:53
    —
Flasher wrote:
Про ключи-то я и не спрашиваю, как ты мог заметить, они в данном скрипте являются объектами.

Ты не прав. У тебя это строка, а не объект.

Flasher wrote:
А я ведь Arrow никогда не пользовался.

Не Arrow, а Array.

Flasher wrote:
Не против, если я там свой скрипт заменю на переделанный?

Не против.

Volniy
Спасибо за информацию.

#237:  Author: FlasherLocation: Москва PostPosted: Fri Nov 26, 2010 12:57
    —
Batya wrote:
У тебя это строка, а не объект.
Строка, использующая метод NameSpace объекта Shell. Что не так?
Batya wrote:
Не Arrow, а Array.
Ну описался. Прям обязательно было поправлять? Smile

#238:  Author: BatyaLocation: Москва, Россия PostPosted: Fri Nov 26, 2010 13:02
    —
Flasher wrote:
Строка, использующая метод NameSpace объекта Shell. Что не так?

Метод NameSpace объекта Shell возвращает строку. Соответственно, ключём массива является строка (а не объект). Не надо сваливать всё в кучу.

Flasher wrote:
Ну описался. Прям обязательно было поправлять?

На всякий случай.

Flasher wrote:
Про ключи-то я и не спрашиваю...

А значения в массивах у тебя пока пустые. (Это я тоже, на всякий случай.)

#239:  Author: FlasherLocation: Москва PostPosted: Fri Nov 26, 2010 13:14
    —
Batya wrote:
Соответственно, ключём массива является строка (а не объект). Не надо сваливать всё в кучу.
Да я специально не сваливаю. Я по понятным причинам только вникаю в нюансы терминологии. Ну что'ж, будем знать.
Напиши тогда, как будет выглядеть использование объектов в подобном массиве. Интересно стало.
Batya wrote:
А значения в массивах у тебя пока пустые.
Ну да. А они мне в данном случае и не нужны. Если бы я использовал ListL/R.Items(L/R), то другое дело.

#240:  Author: RodnyLocation: Могилёв, Беларусь PostPosted: Sat Feb 12, 2011 20:26
    —
Альтернативой метода SetSrcPath (установить путь в панели-источнике TC) из Хелпера является только запуск через командную строку типа
Code:
.Run .ExpandEnvironmentStrings("%COMMANDER_PATH%\totalcmd.exe") & " /O /S /L=" & NewSrcPath

или есть ещё варианты?

#241:  Author: BatyaLocation: Москва, Россия PostPosted: Sat Feb 12, 2011 20:35
    —
Rodny
Нужно установить путь на пассивной панели TC именно из vbs-скрипта?

#242:  Author: FlasherLocation: Москва PostPosted: Sat Feb 12, 2011 20:49
    —
Rodny wrote:
является только запуск через командную строку типа ... или есть ещё варианты?
Знаю только аналог:
Code:
' Перейти(распаковать) к файлу/папке в противоположной панели
' Параметры: %P%N
With CreateObject("WScript.Shell")
.Exec("%COMMANDER_PATH%\totalcmd.exe /O /S /R=""" & WScript.Arguments(0) & """")
End With


Last edited by Flasher on Sun Feb 13, 2011 02:41; edited 1 time in total

#243:  Author: RodnyLocation: Могилёв, Беларусь PostPosted: Sat Feb 12, 2011 21:33
    —
Batya wrote:
Нужно установить путь на пассивной панели TC именно из vbs-скрипта?

Ага, только это активная.
Ищу запасной вариант действий на случай, если Helper на данной машине отсутствует. TC может запускаться с флэшки или даже сетевого диска, поэтому обращение к "totalcmd.exe /O /S" малость тормозит.

Flasher
Спасибо, взял на заметку.

#244:  Author: FlasherLocation: Москва PostPosted: Sat Feb 12, 2011 21:42
    —
Rodny
Значит, флешка медленная. Бери c eSATA-интерфейсом. Smile

#245:  Author: BatyaLocation: Москва, Россия PostPosted: Sun Feb 13, 2011 14:37
    —
Flasher
А с помощью TCFS2.exe можно поменять текущую папку?

#246:  Author: FlasherLocation: Москва PostPosted: Sun Feb 13, 2011 15:06
    —
Batya
Можно ли как-то задействовать функцию msg - не знаю, но тут всё равно придётся API-шки ковырять. Об этом лучше у MVV спросить. А отдельной командой для сих нужд утилита, естественно, не располагает. Предназначение иное, к тому же она не понимает параметры ТС.

#247:  Author: MVVLocation: Ростов-Дон PostPosted: Sun Feb 13, 2011 23:08
    —
Нельзя через TCFS2 изменить текущую папку. Утилита не умеет посылать сообщение WM_COPYDATA, с помощью которого можно менять папки и выполнять em-команды.

Папку можно менять, например, через TCMC, а еще - через TOTALCMD /o /s /l=. Smile


Flasher, точно бы пропустил. Smile

#248:  Author: BatyaLocation: Москва, Россия PostPosted: Mon Feb 14, 2011 10:25
    —
Rodny
Соответственно, требуемый вариант:
Code:
With CreateObject("WScript.Shell")
  .Run """" & .ExpandEnvironmentStrings("%COMMANDER_PATH%\Utils\TCMC\TCMC.exe") & """ CDS """ & NewSrcPath & """ """"", 1, True
End With

#249:  Author: RodnyLocation: Могилёв, Беларусь PostPosted: Mon Feb 14, 2011 16:53
    —
Batya
Спасибо, я ночью уже соорудил почти такое же, только кавычек поменьше Smile

И тут возник вопрос: а может это у меня субъективное восприятие включается и на самом деле там большой разницы и нету?
Как вообще замерить время выполнения этих вариантов, если оно меньше секунды?
Пока играюсь с флэшкой, а она не самая медленная. На глаз после "totalcmd.exe /O /S" каталог меняется медленнее по сравнению с другими вариантами, но вот насколько... Родной DateDiff везде выдаёт 0 секунд.
Гуглятся какие-то конструкции типа GetTickCount, QueryPerformanceCounter и даже Stopwatch Class из .NET Framework. Но это для меня уже слишком сложно.

P.S. Это, в общем-то, уже just for fun, основная задача решена.

#250:  Author: FlasherLocation: Москва PostPosted: Mon Feb 14, 2011 17:26
    —
Rodny
Взял достаточно медленную флешку, распаковал туда INSTALL.CAB, сделал кнопку с предложенным мной скриптом выше - скорость выполнения 1-3 дс, чуть помедленнее Ctrl+Влево/Вправо, разница почти не заметна.

#251:  Author: MVVLocation: Ростов-Дон PostPosted: Mon Feb 14, 2011 17:42
    —
По идее, после неоднократного запуска TOTALCMD /o /s винда просто будет держать файл в кэше и запускать в разы быстрее, чем в первый раз. Для тестов нужно извлекать флешку, чтобы сбросить кэш (или сбрасывать его, если есть чем).

#252:  Author: FlasherLocation: Москва PostPosted: Mon Feb 14, 2011 17:52
    —
MVV
Извини, какой файл? И почему только файл? Тесты проводились над кучей разных папок, файлов с длинными путями. Или ты имеешь в виду скрипт-файл? А флешку взял настолько тормозную, что ТС включается за 3 секунды, а выключается за пять. Smile

#253:  Author: MVVLocation: Ростов-Дон PostPosted: Mon Feb 14, 2011 18:26
    —
Файл TOTALCMD.exe, разумеется. Very Happy
И заодно все файлы, к которым он при запуске обращается.

#254:  Author: FlasherLocation: Москва PostPosted: Mon Feb 14, 2011 18:35
    —
Ясно, первая попытка чуть помедленней - 3-4 дс.

#255:  Author: MVVLocation: Ростов-Дон PostPosted: Mon Feb 14, 2011 21:38
    —
Если тотал запускается с флешки, то, думаю, первая попытка для системы - это в момент его запуска, т.е. до первой попытки вызова скрипта. Smile

#256:  Author: FlasherLocation: Москва PostPosted: Mon Feb 14, 2011 21:41
    —
Первая попытка - это вставка флешки, запуск ТС, запуск скрипта.

#257: Помощь. Author: tohenson PostPosted: Tue Mar 15, 2011 00:11
    —
Ссылка

Можете подсказать как сделать, что-бы хотябы запустить эту прогу или скрипт, просто я наб в этом деле, а данная функция мне очень нужна. Подскажите пожалуйста.

 !  Avada:
Полное вопроизведение текста скрипта заменено ссылкой на оригинальный пост.

#258:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 15, 2011 00:44
    —
tohenson
Во-первых, на форуме есть поиск, а в правилах — пункт 12. Всё давно подсказано и разъяснено. Вот всего один пример результата. Полно и других.
Во-вторых, оверквотинг (избыточное цитирование) на форуме не поощряется. Если уж так сильно хотелось упомянуть, есть ссылки на сообщения.

#259:  Author: combucho PostPosted: Tue Apr 05, 2011 10:12
    —
Требуется скрипт для создания некой заданной заранее структуры папок относительно пути к текущей активной вкладке (пусть она называется root). Структура, например, такая:
Code:

root
    subfolder1
        subsubfolder1
        subsubfolder2
    subfolder2
    subfolder3

Никак не могу взять в толк, как передать скрипту путь к этой вкладке.

#260:  Author: RodnyLocation: Могилёв, Беларусь PostPosted: Tue Apr 05, 2011 15:22
    —
combucho wrote:
как передать скрипту путь к этой вкладке

Макрос GetSrcPath из Script Helper

#261:  Author: FlasherLocation: Москва PostPosted: Tue Apr 05, 2011 16:58
    —
combucho wrote:
как передать скрипту путь к этой вкладке
root=CreateObject("WScript.Shell").CurrentDirectory

#262:  Author: combucho PostPosted: Tue Apr 05, 2011 19:55
    —
Rodny я знал про реализацию через script helper, но предполагал, что точно есть штатные средства. Все равно спасибо!

Flasher спасибо, то что надо! Ларчик просто открывался. Изначально через переменные окружения пытался
Code:
Set ws = CreateObject("WScript.Shell")
root = ws.ExpandEnvironmentStrings("%cd%")

причем странно, что
%WinDir%, %HOMEPATH% и иже с ними работают, а %CD% - нет.

#263:  Author: FlasherLocation: Москва PostPosted: Tue Apr 05, 2011 20:14
    —
Можно ещё через параметр "%P" в кнопке/команде: root = WScript.Arguments()
combucho wrote:
а %CD% - нет
В 7-ке, кстати, её нет.

#264:  Author: combucho PostPosted: Tue Apr 05, 2011 23:50
    —
Flasher wrote:
В 7-ке, кстати, её нет.

Почему нет? Под рукой ноут с Windows 7 Home Premium:
Code:
C:\Users\nataly>ver

Microsoft Windows [Version 6.1.7600]

C:\Users\nataly>echo %cd%
C:\Users\nataly

#265:  Author: RodnyLocation: Могилёв, Беларусь PostPosted: Tue Apr 05, 2011 23:57
    —
combucho
В Win7 Ultimate нет.

#266:  Author: FlasherLocation: Москва PostPosted: Wed Apr 06, 2011 00:28
    —
Хм. С echo показывает, а через set cd - по нулям.

#267:  Author: combucho PostPosted: Mon Apr 11, 2011 12:32
    —
Rodny wrote:
В Win7 Ultimate нет.

Не, и в ультимейт работает через echo

#268:  Author: HEXFIXLocation: Калининград PostPosted: Fri May 06, 2011 19:29
    —
Всем привет. Very Happy
В архиве с плагином есть папка DemoScripts, в которой в свою очередь находится скрипт RestartTotal.vbs. Так вот, он почему-то не работает на 64-битной системе, в частности Windows 7. Total Commander просто закрывается и всё. Можно ли поправить, и если да, то как?

#269:  Author: FlasherLocation: Москва PostPosted: Fri May 06, 2011 19:55
    —
HEXFIX
А зачем вообще Хелпер для этого использовать? Есть и утилиты, и другие скрипты. Тут недавно примеры приводил.

#270:  Author: HEXFIXLocation: Калининград PostPosted: Fri May 06, 2011 20:01
    —
Flasher
О! А я даже и не знал о таких утилитках. Спасибо.
P.S. В коде скрипта по ссылке: "Requirements: Script Helper ActiveX for TC by Volniy" Very Happy

#271:  Author: FlasherLocation: Москва PostPosted: Fri May 06, 2011 20:40
    —
HEXFIX wrote:
В коде скрипта по ссылке: "Requirements: Script Helper ActiveX for TC by Volniy"
А, ну да. Забыл. Там без этого трудновато. Хотя скрипт сам по себе даёт более универсальный вариант перезапуска. Сделать без Хелпера скрипт, аналогичный примеру в DemoScripts - не проблема. Надо?

#272:  Author: HEXFIXLocation: Калининград PostPosted: Fri May 06, 2011 23:50
    —
Flasher
Quote:
Надо?

Если он будет работать при запуске тотала с флэшки, то да, надо! Smile

Добавлено спустя 2 минуты 50 секунд:

Ну и чтоб на 64-бит работал при этом.

#273:  Author: FlasherLocation: Москва PostPosted: Sat May 07, 2011 02:35
    —
Что-то наподобие этого:
Code:
With CreateObject("WScript.Shell")
TCExe = .ExpandEnvironmentStrings("%Commander_Path%\totalcmd.exe")
.SendKeys "%{F4}"
WScript.Sleep 50
.Exec(TCExe)
End With

#274:  Author: Serge Yolkin PostPosted: Sat May 07, 2011 21:31
    —
Вопрос к знатокам (JScript): а можно ли убить зависшую функцию? Не цикл. Ну, например:
Code:
function MyBedniyFunction(){
  objNeZnayuGde.GetNeZnayuChto();
}
вызывается с кнопки (hta), в 99 случаях работает прекрасно, а в сотом - виснет насмерть. Сообщений об ошибке нет, поэтому try не помогает. Только процесс убивать (mshta) вместе с окошком. Вот бы еще такую функцию, чтобы прерывала предыдущую... С кнопки там, или по таймауту...

#275:  Author: FlasherLocation: Москва PostPosted: Sat May 28, 2011 02:41
    —
Serge Yolkin
Какой-то аналог WScript.Timeout должен быть.

All
Никто не знает, почему имитация Esc (SendKeys/SendKeyStroke) при задействовании в файловой панели TC впадает в тяжёлый ступор (цикл)?

#276:  Author: Andrey_ALocation: Сочи PostPosted: Sun Jul 24, 2011 19:51
    —
Подскажите пожалуйста как в скрипте vbs использовать функции другого скрипта, где прописаны только функции
В AkelPad есть функция AkelPad.Include("Functions.vbs")
В au3 есть #include <Excel.au3>
А как в vbs?

#277:  Author: BatyaLocation: Москва, Россия PostPosted: Mon Jul 25, 2011 09:51
    —
Andrey_A wrote:
как в скрипте vbs использовать функции другого скрипта, где прописаны только функции

Code:
Dim FSO
Set FSO = CreateObject("Scripting.FileSystemObject")
Execute FSO.OpenTextFile("C:\Путь\IncludeFile.vbs").ReadAll
...

#278:  Author: Andrey_ALocation: Сочи PostPosted: Mon Jul 25, 2011 10:30
    —
Спасибо, а я через eval(FSO.Open...) пытался

#279:  Author: Andrey_ALocation: Сочи PostPosted: Tue Sep 13, 2011 16:12
    —
Подскажите, пожалуйста такую вещь

Есть текст, как можно создать коллекцию, объктом CreateObject("Scripting.Dictionary") , состоящую из отдельных строк

я пытался следующим образом

1. сначала делал массив
2. затем каждое значение присаивал
Code:
 
  ArBasic = Split(Text, vbNewLine)

  Set oDict = CreateObject("Scripting.Dictionary")
  oDict.RemoveAll
  For Each Item In ArBasic
  If Len(Item) > 0 Then
    If Not bDict.Exists(Item) Then bDict.Add Item, Item
  End If
  Next


есть ли что-нибудь покороче.

#280:  Author: FlasherLocation: Москва PostPosted: Tue Sep 13, 2011 17:41
    —
Знать бы ещё, что такое Text.
Code:
Set FSO = CreateObject("Scripting.FileSystemObject")
Text = FSO.OpenTextFile(WScript.Arguments(0), 1).ReadAll
Set oDict = CreateObject("Scripting.Dictionary")
For Each i in Split(Text, vbNewLine)
  If i > vbNullString Then D.Add i, ""
Next

Andrey_A wrote:
есть ли что-нибудь покороче.
В каком смысле "покороче"? Число строк можно сократить, если писать массив в цикл без создания переменной. Куда тут короче?

#281:  Author: Andrey_ALocation: Сочи PostPosted: Wed Sep 14, 2011 22:44
    —
Flasher
Спасибо, там наверно не
If i > vbNullString Then D.Add i, ""
а
If i > vbNullString Then oDict.Add i, ""

#282:  Author: FlasherLocation: Москва PostPosted: Wed Sep 14, 2011 23:44
    —
Да, я со своего скрипта скопипастил, не обратил внимания.

#283:  Author: ApceHLocation: Димитровград PostPosted: Thu Sep 15, 2011 20:47
    —
У меня есть скрипт для убивания процессов всех программ, лежащих в указанной папке (нужно при (де)инсталляции пака):
Code:
strComputer = "."
strNamespace = "Root\CIMV2"
Set objService = GetObject("WinMgmts:\\" & strComputer & "\" & strNamespace)
Set WshShell = WScript.CreateObject("WScript.Shell")
Set colProcesses = objService.ExecQuery("SELECT * FROM Win32_Process WHERE ExecutablePath Like '" & Replace(WScript.Arguments(0),"\","\\") & "%'")
For Each objProcess in colProcesses
  objProcess.Terminate()
Next

В первом аргументе передаётся путь.
Вполне работает... Но убивает процессы только текущего пользователя. Если кто-то ещё вошёл в систему и запустил какую-нибудь прогу — тот процесс не убъётся...
Как решить задачу?

#284:  Author: Serge Yolkin PostPosted: Thu Sep 15, 2011 22:43
    —
ApceH wrote:
Как решить задачу?

Запускать скрипт от админа (в Vista/7 - еще и с повышением прав)

#285:  Author: ApceHLocation: Димитровград PostPosted: Thu Sep 15, 2011 22:57
    —
Serge Yolkin
Нет.
Сейчас смотрю, выдаются-то все процессы.
Но Terminate не срабатывает. Причем НЕ из-за прав, а, как я подозреваю, из-за того, что сеанс пользователя приостановлен...


Last edited by ApceH on Thu Sep 15, 2011 23:07; edited 1 time in total

#286:  Author: FlasherLocation: Москва PostPosted: Thu Sep 15, 2011 23:04
    —
ApceH wrote:
Code:
Set WshShell = WScript.CreateObject("WScript.Shell")
- это лишнее.

А в другом сеансе программы точно из этой папки запускаются?

#287:  Author: ApceHLocation: Димитровград PostPosted: Thu Sep 15, 2011 23:17
    —
Flasher
Да. Сейчас вывел все процессы с их путями. Перечисление срабатывает. Отличие лишь одно:
objProcess.GetOwner возвращает разных пользователей. То есть всё правильно.
В крайнем случае я возьму objProcess.ProcessId и просто убью по пиду. Сейчас попробую. Но почему же Terminate не срабатывает! Crying or Very sad

#288:  Author: RodnyLocation: Могилёв, Беларусь PostPosted: Thu Sep 15, 2011 23:31
    —
Что-то никак не могу понажимать кнопки в ИГП. Открываю, например, через TCMC
Code:
Dim WSH, TCS
Set WSH = CreateObject("WScript.Shell")
Set TCS = WScript.CreateObject("TCScript.Helper")
WSH.Run """" & WSH.ExpandEnvironmentStrings("%COMMANDER_PATH%\Utils\TCMultipleCommands\TCMC.exe") & """ 50 CM2400" & """ """"", 1, True
Wscript.Sleep 1000
' варианты:
'WSH.SendKeys "qwe"
TCS.SendKeystroke "qwe"

Отправка клавиш происходит уже в сам TC после ручного закрывания диалога. До этого окно не подаёт признаков жизни.

#289:  Author: ApceHLocation: Димитровград PostPosted: Thu Sep 15, 2011 23:37
    —
Сделал убийство процессов через костыль:
Code:
Set objService = GetObject("WinMgmts:\\.\Root\CIMV2")
Set WshShell = WScript.CreateObject("WScript.Shell")
Set colProcesses = objService.ExecQuery("SELECT * FROM Win32_Process WHERE ExecutablePath Like '" & Replace(WScript.Arguments(0),"\","\\") & "%'")
PIDs = ""
For Each objProcess in colProcesses
  PIDs = PIDs & " /PID " & objProcess.ProcessId
Next
WshShell.Run "TASKKILL /F" & PIDS, 0, False

Если кто подскажет, как без запуска сторонних программ, будет совсем хорошо!

#290:  Author: FlasherLocation: Москва PostPosted: Thu Sep 15, 2011 23:55
    —
ApceH
Можно использовать tskill c ключом /A для всех сеансов. Т.е.:
Code:
Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
For Each p in WMI.ExecQuery("SELECT * FROM Win32_Process WHERE ExecutablePath Like '" & Replace(WScript.Arguments(0),"\","\\") & "%'")
  CreateObject("WScript.Shell").Run "tskill " & p.ProcessID & " /A", 0
Next


Rodny
Code:
With CreateObject("WScript.Shell")
  .Exec("%COMMANDER_PATH%\Utils\TCMultipleCommands\TCMC.exe CM2400")
'  .Run """" & .ExpandEnvironmentStrings("%COMMANDER_PATH%\Utils\TCMultipleCommands\TCMC.exe") & """ CM2400", 1
  Wscript.Sleep 40
  .SendKeys "qwe"
End With

#291:  Author: ApceHLocation: Димитровград PostPosted: Fri Sep 16, 2011 22:16
    —
Нет Crying or Very sad Приведённые в двух постах выше скрипты для убийства процессов из папки не работают в общем случае.
В Win6+ нет tskill, во-первых. Мой скрипт работает только в Win6+.
В XP совсем другая проблема, которая меня ввела в ступор совсем.
Там свойства ExecutablePath (и даже CommandLine) равны пустой строке, если речь идёт о процессе в другом сеансе... Поэтому хоть tskill, хоть taskkill применить не удастся!

Единственный выход вижу: насильно завершить все сеансы, кроме текущего...

#292:  Author: FlasherLocation: Москва PostPosted: Fri Sep 16, 2011 22:56
    —
ApceH wrote:
В Win6+ нет tskill, во-первых.
А поставить?
Если не работает, можно перед /A указать /server:<Имя компа>

#293:  Author: ApceHLocation: Димитровград PostPosted: Fri Sep 16, 2011 23:00
    —
Flasher
Уже без разницы, чем убивать, если нельзя получить список процессов, запущенных из папки, в XP...
Поставить tskill? Зачем????

Я понимаю, что запрограммировать это на винапи за полчаса можно. Но не писать же новую программу для каждой появившейся задачи(((

#294:  Author: RodnyLocation: Могилёв, Беларусь PostPosted: Fri Sep 16, 2011 23:15
    —
Flasher
Спасибо.

#295:  Author: FlasherLocation: Москва PostPosted: Fri Sep 16, 2011 23:21
    —
ApceH wrote:
Уже без разницы, чем убивать, если нельзя получить список процессов
Т.е. как нельзя? А в чём проблема? (я просто не хочу создавать акк для тестов.)

Можно, конечно, убивать по имени, но тогда будут убиваться одноимённые процессы не только из этой папки.

#296:  Author: ApceHLocation: Димитровград PostPosted: Fri Sep 16, 2011 23:29
    —
ApceH wrote:
В XP совсем другая проблема, которая меня ввела в ступор совсем.
Там свойства ExecutablePath (и даже CommandLine) равны пустой строке, если речь идёт о процессе в другом сеансе... Поэтому хоть tskill, хоть taskkill применить не удастся!

Короче, сделал просто вот так пока:
Code:
Set objService = GetObject("WinMgmts:")
Set WshShell = WScript.CreateObject("WScript.Shell")
XP = (Left(WshShell.RegRead("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\CurrentVersion"),1) = "5")
If XP Then
  Set colSessions = objService.ExecQuery("Select * from Win32_LogonSession Where LogonType = 2")    
  If colSessions.Count > 1 Then
    WScript.Quit 1
  End If
End If
Set colProcesses = objService.ExecQuery("SELECT * FROM Win32_Process WHERE ExecutablePath Like '" & Replace(WScript.Arguments(0),"\","\\") & "%'")
If XP Then
  For Each objProcess in colProcesses
    WshShell.Run "TSKILL /A " & objProcess.ProcessId, 0, False
  Next
Else
  For Each objProcess in colProcesses
    WshShell.Run "TASKKILL /F /PID " & objProcess.ProcessId, 0, False
  Next
End If
WScript.Quit 0
Уже в вызывающем процесс (в NSIS-скрипте) проверяю возвращаемый код и, если =1, говорю пользователю завершить все сеансы кроме админовского...
Кстати, обнаружил интересность... Если завершить сеанс через диспетчер задач, то он не полностью завершается colSessions.Count будет всё ещё > 1... Только настоящий выход прокатит.

Ну будет время напишу, конечно, утилку, раз дохлый номер с WSH/WMI...

#297:  Author: Andrey_ALocation: Сочи PostPosted: Mon Sep 19, 2011 18:11
    —
Подскажите как правильно передать адрес интернета с параметрами

Code:
CreateObject("WScript.Shell").Run "http://translate.google.com/#auto|ru|\привет"


пробовал и с пробелам и с чёрточками, не получается - переходит к сайту, выдаёт ошибку, параметр соответственно не передаёт

#298:  Author: ApceHLocation: Димитровград PostPosted: Mon Sep 19, 2011 18:18
    —
Andrey_A
А у меня открывается так:
Code:
CreateObject("WScript.Shell").Run "http://translate.google.com/#ru|en|привет"

В чём проблема-то?

#299:  Author: Andrey_ALocation: Сочи PostPosted: Mon Sep 19, 2011 18:22
    —
У меня выдаёт ошибку
Code:
Сценарий:   C:\TC Image\AkelFiles\Plugs\Scripts\Test_001.vbs
Строка:   1
Символ:   1
Ошибка:   Не удается найти указанный файл.
Код:   80070002
Источник:    (null)


в скрипте одна эта строка

#300:  Author: ApceHLocation: Димитровград PostPosted: Mon Sep 19, 2011 18:27
    —
Andrey_A
Понял проблему. Преобразуй в ANSI-кодировку. Или в юникод UCS-2 Little Endian.

#301:  Author: Andrey_ALocation: Сочи PostPosted: Mon Sep 19, 2011 18:32
    —
У меня файл в ANSI-крирлица Windows-1251

пытался в другие кодировки - ничего

===============================
может это что-то в системе, попробовал через "выполнить"
ввёл
Code:
http://translate.google.com/#ru|en|

тоже выдаёт ошибку
"не удаётся найти адрес" , хотя страница открылась

================================
скорее всего это что-то в системе, через explorer выдаёт ошибку
Code:
CreateObject("WScript.Shell").Run "C:\TC Image\Programs\Internet\Opera_AC\opera.exe" "http://translate.google.com/#auto|en| Запуск"


напрямую опере - ошибки нет, хотя русские слова передаются корозябрами

#302:  Author: FlasherLocation: Москва PostPosted: Mon Sep 19, 2011 20:44
    —
Code:
' Тройное открытие ссылки в браузере 3-мя методами
'==========================================
URL = "http://translate.google.com/#ru|en|"
On Error Resume Next
With CreateObject("Shell.Application")
  .ShellExecute URL
  .Open URL
  .NameSpace(URL).Self.Verbs.Item(0).DoIt
End With
Проверено на Win 7 x86.

#303:  Author: Andrey_ALocation: Сочи PostPosted: Mon Sep 19, 2011 21:18
    —
Flasher
За методы спасибо,
Когда все три метода показали ошибку, логически влез в explorer и сделал его по умолчанию - и всё заработало!!!
Видимо опера прописалась не корректно!
Ещё раз спасибо и ApceH, за то узнал новые возможности вызова!

#304:  Author: sa PostPosted: Mon Oct 10, 2011 13:58
    —
Возник вопрос по работе макроса GetSrcSelectedFiles в каталогах с большим числом файлов (например, в каталоге Windows c нажатым Ctrl+B). Макрос зачастую выдаёт неправильный результат. Порой помогает его повторный вызов.
Code:
MsgBox CreateObject("TCScript.Helper").GetSrcSelectedFiles(0)(0), vbOKOnly

Понять бы причину...

#305:  Author: FlasherLocation: Москва PostPosted: Mon Oct 10, 2011 14:04
    —
Volniy
Это давно замечено. Править надо однозначно. Повторные вызовы в скрипте макрос отрабатывает глюкабельно, т.е. берёт предыдущий буфер.

#306:  Author: FlasherLocation: Москва PostPosted: Thu Oct 27, 2011 21:17
    —
Lev wrote:
А зачем составляется путь к ini который может лежать не там и называться по другому вместо использования %COMMANDER_INI%?
Помнится с этой переменной какие-то проблемы были в WSH. На 7 попробовал, вроде ничего:
Code:
MsgBox  CreateObject("WScript.Shell").ExpandEnvironmentStrings("%COMMANDER_INI%")
Может, в XP трабла?

#307:  Author: VolniyLocation: Местный PostPosted: Thu Nov 03, 2011 00:23
    —
Flasher wrote:
Volniy
Это давно замечено. Править надо однозначно. Повторные вызовы в скрипте макрос отрабатывает глюкабельно, т.е. берёт предыдущий буфер.

Честно говоря, я не очень понял в чем проблема и уж точно слышу о ней впервые. Нельзя ли описать ее более детально? И как ее можно гарантированно воспроизвести?

#308:  Author: FlasherLocation: Москва PostPosted: Thu Nov 03, 2011 01:31
    —
Volniy
Ну, давай так попробуем:
Code:
With CreateObject("TCScript.Helper")
  .SendCommand(524)
  .LockTC True
  .SendCommand(3303), True
  A = .GetSrcSelectedFiles(1)(2)
  .Sleep 100
  .SendCommand(3305)
  .SendCommand(3302), True
  B = .GetSrcSelectedFiles(1)(2)
  .Sleep 100
  .SendCommand(3304)
  .LockTC False
End With
MsgBox A & vbnewLine & B
Повесь на кнопку, открой папку с кучей файлов и каталогов, например, system32. Жми. Сделай несколько попыток.
Отображаться должны разные, а не одинаковые пути.

#309:  Author: VolniyLocation: Местный PostPosted: Sat Nov 05, 2011 00:20
    —
Много раз это попробовал. Никаких проблем. Может еще что-то нужно?

#310:  Author: FlasherLocation: Москва PostPosted: Sat Nov 05, 2011 00:45
    —
Хм., надо подумать.. Хилый проц, не младше Celeron 400, оперативка EDO/DDR, древний винт с 5400, Win95, куча открытых приложений. Так, ничего не забыл... Very Happy
А если честно, то я понятия не имею, от чего конкретно это зависит. С каким количеством папок и файлов ты открывал директории?
Чаще всего это можно поймать при первом заходе в каталог.
У меня Win7 x86, если что.

#311:  Author: FlasherLocation: Москва PostPosted: Sat Nov 26, 2011 11:28
    —
Batya
У тебя на 7 работает подобный способ переименования?:
Code:
FSO.GetFile(F).Name   =
Не очень понял, как это вообще может работать. Это же метод возврата.

#312:  Author: VolniyLocation: Местный PostPosted: Sat Nov 26, 2011 16:18
    —
Flasher wrote:

Code:
FSO.GetFile(F).Name   =
Не очень понял, как это вообще может работать. Это же метод возврата.


Неправда ваша (с) Ваня, Сын Полка
Это не метод, это свойство, и оно не readonly
Quote:
Scripting Runtime Library

Name Property
Applies To: File Object | Folder Object

Sets or returns the name of a specified file or folder. Read/write.

object.Name [= newname]

#313:  Author: FlasherLocation: Москва PostPosted: Sat Nov 26, 2011 23:01
    —
Volniy wrote:
Это не метод
Здесь фигурирует как метод.
Ты хотя бы ответь насчёт работы.

#314:  Author: VolniyLocation: Местный PostPosted: Sun Nov 27, 2011 02:06
    —
Flasher wrote:
Здесь фигурирует как метод.

А если повнимательнее?
Quote:
5. Объект File
<...> 5.2. Свойства
<...>
5.2.6. Name

Flasher wrote:
Ты хотя бы ответь насчёт работы.

Я не знаю, у меня на XP работает, на 7 не могу проверить.

Idea Мое мнение - лучше вообще не использовать такую запись кода, когда в одном вызове создается объект и тут же меняется его свойство. Такая запись не имеет никаких реальных выгод и действительно иногда приводит к неработоспособности кода. Проще и намного нагляднее разбивать на несколько последовательных действий.

#315:  Author: FlasherLocation: Москва PostPosted: Sun Nov 27, 2011 06:43
    —
Volniy wrote:
А если повнимательнее?
На Name даже не обратил внимания. Про режим write не знал. Надо бы все знакомые свойства пересмотреть.
Volniy wrote:
Проще и намного нагляднее разбивать на несколько последовательных действий.
На два - ты хотел сказать.

#316:  Author: VolniyLocation: Местный PostPosted: Sun Nov 27, 2011 14:16
    —
Насчет не read-only свойств и сам пару раз лажался. Например, был уверен, что даты файла из FSO можно только прочитать, а оказалось-то - нет Embarassed

Flasher wrote:
На два - ты хотел сказать.

Я же не об этой конкретной строке. Дело в том, что если посмотреть на VBS скрипты тут, на форуме, то можно увидеть еще и более многоэтажные конструкции.

PS Вот сейчас припомнил случай, когда такие нагромождения не работали с 5-ой версии скриптов, а после установки 5.6 они уже заработали. Так что еще зависит и от реализации конкретной версии WSH.

#317:  Author: FlasherLocation: Москва PostPosted: Sun Nov 27, 2011 14:47
    —
Volniy wrote:
Например, был уверен, что даты файла из FSO можно только прочитать, а оказалось-то - нет
Мануалы устаревшие, получается.
Volniy wrote:
Дело в том, что если посмотреть на VBS скрипты тут, на форуме, то можно увидеть еще и более многоэтажные конструкции.
Что ты под ними понимаешь?
Кстати, "Set N = FSO.GetFile(F)" не помогает. Всё равно на "N.Name =" плюётся сообщением: "Недопустимый вызов или аргумент процедуры". Может, в 7-ке убрали запись? Surprised

#318:  Author: VolniyLocation: Местный PostPosted: Sun Nov 27, 2011 15:47
    —
Flasher wrote:
Что ты под ними понимаешь?

Сложные вызовы объектов и их свойств/методов. Как бы это попроще... Выражения, в которых много точек Smile Ну, например:
Code:
CreateObject("Scripting.FileSystemObject").CreateTextFile(InFile).WriteLine(stroka)
Черт ногу сломает...

Flasher wrote:
Может, в 7-ке убрали запись? Surprised

Не-а. Вот специально пошел на чужой комп с 7-кой. Все работает, в том числе и первоначальный, навороченный, вариант. Скорее всего какие-то заморочки 7-ки с правами доступа для переименования файла. Проверь.

#319:  Author: FlasherLocation: Москва PostPosted: Sun Nov 27, 2011 15:54
    —
Volniy wrote:
Черт ногу сломает...
А мне нравится. Не люблю кучу строк, когда можно всё запихнуть в одну (там, где это позволительно, конечно).
Volniy wrote:
Скорее всего какие-то заморочки 7-ки с правами доступа для переименования файла. Проверь.
Род.контроль отключён, софтовой защиты нет, сижу под админом, беру обычные безатрибутные текстовые файлы в папке C:\Тест.

#320:  Author: kinecter PostPosted: Tue Nov 29, 2011 12:48
    —
Всем привет!
Много лет посещал этот форум, многому научился а зарегистрировался только сегодня - решил поделиться опытом.
Эту ветку выбрал - показалась она самой подходящей, так как код включает HTA + VBS.
Пару лет уже пользуюсь собственной утилитой для множественной замены текста в файлах.
Вопрос к уважаемому форуму: я могу выкладывать все здесь? или стоит открыть новую ветку? так как кода достаточно много

#321:  Author: FlasherLocation: Москва PostPosted: Tue Nov 29, 2011 13:12
    —
kinecter
Раз много лет посещался форум, то можно было бы за это время научиться определять места надлежащего назначения и пользоваться поиском аналогичных решений.
Эта ветка по обсуждению языка, а не по выкладыванию утилит и скриптов. Большие HTA-коды лучше выкладываеть в MIME, как это делается в подфоруме "Программное обеспечение".
Сами темы уже решались здесь и здесь.

#322:  Author: kinecter PostPosted: Tue Nov 29, 2011 13:39
    —
Flasher wrote:
kinecter
Раз много лет посещался форум, то можно было бы за это время научиться определять места надлежащего назначения и пользоваться поиском аналогичных решений.
Эта ветка по обсуждению языка, а не по выкладыванию утилит и скриптов.
.......
Сами темы уже решались здесь и здесь.


Спасибо за совет!
Про поиск и про то где эти темы решались, я в курсе - бывал не раз на тех ветках.

а вот что значит :
Flasher wrote:
.
Большие HTA-коды лучше выкладываеть в MIME

-пока не совсем в курсе. Буду искать, но ежели подскажете - с удовольствием прочитаю ваши советы.
Хотя, собственно HTA код там не слишком большой , ежели отделить от него стили и VBS

#323:  Author: FlasherLocation: Москва PostPosted: Tue Nov 29, 2011 13:47
    —
kinecter
Подсказать может хотя бы справка. HTA имелся в виду в совокупности с остальным кодом. Не по отдельности же выкладывать.

#324:  Author: kinecter PostPosted: Tue Nov 29, 2011 14:05
    —
Flasher wrote:
Подсказать может хотя бы справка.

все таки с вашей подсказкой все ищется гораздо быстрее.
Благодарю!
Flasher wrote:
HTA имелся в виду в совокупности с остальным кодом. Не по-отдельности же выкладывать.

По моему, если выкладывать кусками(HTA, STYLE,и VBS на пару частей разделить), то гораздо наглядней получится.
Ну ладно, прикину - померю - посмотрю.
Может мои произведения и не такие уж объемные - чуть больше 200 строк..

Тут на форуме, помнится, встречал портянки и подлиннее.

#325:  Author: FlasherLocation: Москва PostPosted: Tue Nov 29, 2011 14:14
    —
kinecter
Радиола от Serge Yolkin - 576 строк.

#326:  Author: Andrey_ALocation: Сочи PostPosted: Sat Jan 14, 2012 20:42
    —
Появился вопрос
Есть шрифт файл Arialm.ttf
Можно ли методами скриптинга узнать название шрифта "Arial Mod"?

 !  Avada:
Перемещено из темы Script Request. Данный пост запросом на скрипт не является.

#327:  Author: Lev PostPosted: Mon Jan 16, 2012 15:48
    —
В теме wdx ActiveX кинул пример.
Также загляни в Использование wdx-плагинов в скриптах

#328:  Author: FlasherLocation: Москва PostPosted: Mon Jan 16, 2012 16:02
    —
Lev
Ты прямо мысли читаешь, только то же самое хотел предложить. Smile

Andrey_A
Портабельный вариант:
Code:
' Получить заголовок файла под курсором
' Параметры: "%P" %N
'======================================
Set Folder = CreateObject("Shell.Application").NameSpace(WScript.Arguments(0))
MsgBox Folder.GetDetailsOf(Folder.ParseName(WScript.Arguments(1)), 21)

#329:  Author: Andrey_ALocation: Сочи PostPosted: Mon Jan 16, 2012 21:28
    —
Flasher и Lev спасибо, уже почти сам догадался...
Использование wdx-плагинов в скриптах будет следующим этапом освоение скриптов...

#330:  Author: FlasherLocation: Москва PostPosted: Sun Dec 23, 2012 11:29
    —
LonerD wrote:
А как в vbs-скрипте узнать, что мы находимся в архиве?
Параметр "%P" без слеша на конце проверить на FSO.FileExists или FSO.FolderExists. Либо проверить на доступность элемент под курсором.
Либо так (убрав путь запуска):
Code:
If CreateObject("WScript.Shell").CurrentDirectory = CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.arguments(0)) Then MsgBox "Открыт архив" Else  MsgBox "Открыта папка"

#331:  Author: LonerDLocation: Донецк PostPosted: Wed Jan 02, 2013 00:14
    —
Flasher
Спасибо.

#332: ReplaceInFiles.vbs Author: iG0R PostPosted: Tue Mar 19, 2013 20:19
    —
Имеется следующий скрипт ReplaceInFiles.vbs со страницы №4 этого топика. http://forum.wincmd.ru/viewtopic.php?p=14843
Подскажите, как осуществить замену искомого текста другим текстом, частью которого является Escape последовательность.
Например, в файлах необходимо заменить "https" на "[InternetShortcut]\r\nURL=https", где \r\n - это esc-последовательность.

#333:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Mar 26, 2013 20:05
    —
iG0R
http://forum.wincmd.ru/viewpost.php?p=69647


Last edited by Batya on Tue Mar 26, 2013 20:14; edited 1 time in total

#334:  Author: iG0R PostPosted: Tue Mar 26, 2013 20:13
    —
Batya
Спасибо за ответ, но этот скрипт
по сути ничем не отличается от ReplaceInFiles.vbs со страницы №4
Code:

'  File:         ReplaceInFiles.vbs
'  Description:  Search and replace of text
'                in selected files
'  Installation: Create a button on a TC bar
'                Command: "disk:\path\ReplaceInFiles.vbs"
'                Parameters: "%L" (exactly in "")
'  Copyright:    (c) 2006, Volniy (mod by Yuk)
 
Option Explicit
 
Dim FSO, Find_String, Replace_String, F, Buffer, ListFile, re
Const ForReading = 1, ForWriting = 2
 
Set FSO = CreateObject("Scripting.FileSystemObject")
Set re = New RegExp
 
Find_String = InputBox("Enter search string", "Search and Replace")
If Len(Find_String) = 0 Then
   MsgBox "Search string was not set!", vbExclamation, "Search and Replace"
   WScript.Quit()
End If
 
Replace_String = InputBox("Enter replace string", "Search and Replace")
 
Set ListFile = FSO.OpenTextFile(WScript.Arguments(0), 1)
Do While Not ListFile.AtEndOfStream
   Call DoItForThisFile(ListFile.ReadLine)
Loop
ListFile.Close
Set ListFile = Nothing
Set F = Nothing
Set FSO = Nothing
 
MsgBox "Replace done!", vbInformation, "Search and Replace"
WScript.Quit
 
Sub DoItForThisFile(FilePath)
   Set F = FSO.OpenTextFile(FilePath, ForReading)
   Buffer = F.ReadAll
   F.Close
 
 
    re.Pattern = Find_String
    re.Global = True
    re.IgnoreCase = True
    re.MultiLine = True 
 
   Buffer = re.Replace(CStr(Buffer), Replace_String)
   FSO.CopyFile FilePath, FilePath & ".bak"
 
   Set F = FSO.OpenTextFile(FilePath, ForWriting)
   F.Write Buffer
   F.Close
End Sub


Который может искать по Esc-последовательности, но не может заменять. Sad

#335:  Author: BatyaLocation: Москва, Россия PostPosted: Tue Mar 26, 2013 20:33
    —
iG0R
Хм... Sad

Скрипт, использующий EmEditor, с той же страницы работает, как тебе надо.

#336:  Author: AvadaLocation: Россия, Саратов PostPosted: Tue Mar 26, 2013 20:54
    —
iG0R
Зачем было полностью цитировать скрипт, на который выше уже давалась ссылка? Скрипта "ReplaceInFiles.vbs со страницы №4" в представленном виде на указанной странице нет — приведён модифицированный вариант, взятый из какого-то другого источника (и на него была бы уместна ссылка).
Приучаемся к порядку — и на форуме вообще, и конкретно в "Автоматизации". См. также здесь.
В предыдущие посты внесены некоторые изменения.

#337: Windows Script Host Author: Krots PostPosted: Wed Feb 26, 2014 00:47
    —
В Win7 32 не получается установить сей замечательный продукт TCWSHelp.exe. Выдает ошибку "Unexpected error; quitting". На ХР все нормально. Подскажите, плз, как решить проблему?

#338:  Author: RodnyLocation: Могилёв, Беларусь PostPosted: Wed Feb 26, 2014 02:04
    —
Какая версия хелпера? Запуск от имени админа?

#339: Windows Script Host Author: Krots PostPosted: Wed Feb 26, 2014 07:02
    —
Да, запуск от имени админа помог, спасибо. В ХР как то попроще было, 10 лет на ней сидел, теперь такая ломка, ужс.

#340: Поиск и замена текста без тотала Author: dydaevskiy PostPosted: Sun May 04, 2014 23:41
    —
Возможно ли изменить скрипт что бы он делал свою работу без тотала? То есть я просто помещаю скрипт в папку, в скрипте пишу что найти и на что заменить. Скрипт после запуска будет искать и заменять во всех .txt и .m3u файлах нужные строки, в независимости от того в какой папке или подпапки данные файлы находятся.

#341:  Author: FlasherLocation: Москва PostPosted: Mon May 05, 2014 01:33
    —
dydaevskiy
Возможно, конечно, но тогда это уже будет не Автоматизация Total Commander.
Да и скрипт в таком случае не особо нужен, программ-заменялок в сети - тьма.

#342:  Author: dydaevskiy PostPosted: Mon May 05, 2014 11:26
    —
Да в том то и дело что в тотале не могу настроить полноценный планировщик. А так я б скрипт закинул стандартному планировщику windows и все было б отлично. Перерыл тьму программ заменялок, но планировщика в них нет. Прошу прощение что не совсем по теме, но уж очень сильно нуждаюсь в помощи.

#343:  Author: FlasherLocation: Москва PostPosted: Mon May 05, 2014 11:55
    —
dydaevskiy
Это не меняет картины. Файлменеджер и планировщик уже по сути имеют разные цели. Тут же тема конкретно по синтаксису языков на основе WSH, применительно к ТС.
Что же касается планировщика, то есть смысл в отношении него задействовать консольные приложения (пример 1, пример 2, пример 3).

#344:  Author: Dimsok PostPosted: Sun Aug 17, 2014 01:37
    —
Создание текстового файла с содержимым буфера обмена

Как сделать, чтобы файл создавался в активной панели, а не в папке, где лежит данный скрипт. Может какие-то параметры прописать. И желательно, чтобы файл создавался сразу, без необходимости подтверждения

 !  Avada:
Про правила оформления скриптов и ссылок на них говорилось многократно, в том числе в текущей теме на этой же странице. Приведено к нормальному состоянию.

#345:  Author: FlasherLocation: Москва PostPosted: Sun Aug 17, 2014 02:21
    —
Dimsok
См. прилепленную тему подфорума. В скобках что написано? Угу...
Заодно см. этот вариант.

#346:  Author: Dimsok PostPosted: Mon Aug 18, 2014 14:47
    —
А можно сделать, чтоб создаваемый файл назывался по первой строчке скопированного? И без знака коммента. Чтоб было скрипты удобней копировать

#347:  Author: FlasherLocation: Москва PostPosted: Mon Aug 18, 2014 15:26
    —
Dimsok
Запросы на скрипты здесь (пример). Там и спрашиваем.

#348:  Author: BatyaLocation: Москва, Россия PostPosted: Wed Aug 20, 2014 09:43
    —
Dimsok wrote:
Как сделать, чтобы файл создавался в активной панели, а не в папке, где лежит данный скрипт.

Типичная ошибка - надо у кнопки очистить "Путь запуска".

Dimsok wrote:
И желательно, чтобы файл создавался сразу, без необходимости подтверждения

Самый простой вариант - заменить строку
Code:
Btn = MsgBox(Mess, vbYesNo + vbQuestion, Title)
на строку
Code:
Btn = vbYes 'MsgBox(Mess, vbYesNo + vbQuestion, Title)

#349:  Author: FlasherLocation: Москва PostPosted: Wed Aug 20, 2014 13:05
    —
Batya wrote:
Типичная ошибка - надо у кнопки очистить "Путь запуска".
Памятка (на которую было выше указание) - п. 7). И без всяких типичностей. Только недавно проходили.

#350: Re: 4-ая редакция Author: borro PostPosted: Mon May 29, 2017 10:48
    —
Здравствуйте!
Воспользовался этим скриптом для поиска и замены подстрок во всех файлах папки, включая подпапки.

Для этого согласно инструкции
1. создал кнопку,
2. назначил параметр %L
3. Зашел в нужную папку, вызвал ctrl+b, выделил найденные файлы и нажал кнопку вызова скрипта.
4. Там вбил строку, которую искать, вбил на что заменять и получил ошибку "Ввод данных за пределами файла" Код ошибки 800A003E

Что может быть не так? Или скрипт не для этой задачи?

 !  Avada:
См. правила форума. Цитата заменена ссылкой.

#351:  Author: FlasherLocation: Москва PostPosted: Mon May 29, 2017 17:01
    —
borro
Памятка раздела обязательна к прочтению. Нижние пункты (особенно 1, 2).
Данный скрипт работает только с ANSI. Также он споткнётся на пустых файлах.

#352:  Author: sonmax PostPosted: Thu Jul 13, 2017 12:26
    —
Добрый день!
Подскажите пожалуйста, как надо подправить скрипт, чтобы при запуске программы
в левой части ТС открывалась папка C:\tmp
Code:
set WSShell = createobject("Wscript.Shell")
WSShell.Run "c:\tmp\AkelPad.exe"
WSShell.CurrentDirectory="C:\tmp"
WScript.Quit

Так не работает.
Спасибо.

#353:  Author: BatyaLocation: Москва, Россия PostPosted: Thu Jul 13, 2017 12:56
    —
sonmax
Замени 3-ю строку:
Code:
WSShell.Run """" & WSShell.ExpandEnvironmentStrings("%COMMANDER_EXE%") & """ /O /L=C:\tmp", 1, True

#354:  Author: sonmax PostPosted: Thu Jul 13, 2017 13:11
    —
Batya
Спасибо большое! То что нужно!

Добавлено спустя 2 часа 5 минут:

Еще вопрос, а как сделать чтобы эта папка открывалась в новой вкладке?

#355:  Author: sa PostPosted: Thu Jul 13, 2017 15:41
    —
sonmax
Добавить параметр /T.

#356:  Author: FlasherLocation: Москва PostPosted: Thu Jul 13, 2017 16:16
    —
sonmax
А ваш вопрос к теме создания папок какое отношение имеет? Тем более что он не нуждается в скрипте, а элементарно решается на базе кнопки или ярлыка. Только бы понять ещё, о запуске какой программы (ТС или скрипт) и откуда (ТС или проводник) шла речь. В любом случае это справочные вопросы, многократно тут обсуждённые (один из последних примеров).

#357:  Author: AvadaLocation: Россия, Саратов PostPosted: Thu Jul 13, 2017 18:20
    —
sonmax
Замечание за нарушение правил форума. Оверквотинг удалён. Перенесено по принадлежности.

#358:  Author: FlasherLocation: Москва PostPosted: Thu Dec 14, 2017 11:20
    —
ingerard wrote:
Я использую wscript ранней версии, моя текущая версия в системе не работает почему-то.
Вот такой набор с собой ношу, на всякий случай:
vbscript.dll
wscript.exe
wscript5.8.7600.16385.exe
wscript5.8.7601.18283.exe
Что конкретно происходит в момент запуска? vbscript.dll без регистрации не несёт никакой полезной нагрузки.
И для каких целей ещё две версии wscript?

#359:  Author: ingerard PostPosted: Thu Dec 14, 2017 11:43
    —
Flasher
vbscript.dll нужен в загрузочной системе LiveCD, просто чтоб находился рядом, без него ошибку кидает, точно не помню какую, могу потом посмотреть.

Flasher wrote:
И для каких целей ещё две версии wscript?

Эти версии я просто скопировал, чтоб были, пока никакой необходимости в них нет.
wscript5.8.7601.18283.exe - это версия из моей системы, она не работает, выкидывает окошко консоли и пропадает. Можно окошко как-то приостановить? Может там что-то пишет...

#360:  Author: FlasherLocation: Москва PostPosted: Thu Dec 14, 2017 12:08
    —
ingerard wrote:
vbscript.dll нужен в загрузочной системе LiveCD
А. На WinPE не смотрел, как это работает. Может, он регистрацию всех dll производит.
ingerard wrote:
выкидывает окошко консоли и пропадает.
wscript не является консольной. Может, это переименованный cscript.exe? См. "Исходное имя файла" в свойствах на вкладке "Подробно", PEViewer или InternalName в FileInfo.
ingerard wrote:
Можно окошко как-то приостановить?
Pause/Break нажать.

#361:  Author: ingerard PostPosted: Thu Dec 14, 2017 13:23
    —
Flasher
Оказывается wscript.exe который находится у меня в системе так же нормально работает если его поместить в папку рядом с TCScript.dll. Именно из своей системной папки он не хочет работать или вызов на него как-то неправильно делается.

p.s. Вы были правы, удалось увидеть что за консоль появляется, и в ней фигурирует путь на CScript.exe. Как это исправить?

#362:  Author: FlasherLocation: Москва PostPosted: Thu Dec 14, 2017 13:56
    —
ingerard wrote:
или вызов на него как-то неправильно делается.
Вызов — это путь к скрипту с параметрами и только.
А если set %PATH% из cmd выполнить, в списке C:\system32 будет?
ingerard wrote:
Как это исправить?
Зачем это исправлять? Не использовать, да и всё.

#363:  Author: ingerard PostPosted: Thu Dec 14, 2017 14:11
    —
Flasher wrote:
А если set %PATH% из cmd выполнить, в списке C:\system32 будет?

Переменная среды C:\Program Files\NVIDIA Corporation\PhysX\Common;C:\Windows\sys
tem32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\
v1.0\;C:\Program Files\ESET\ESET Remote Administrator\Console\ не определена


Flasher wrote:
Зачем это исправлять? Не использовать, да и всё.

Так если просто указывать путь к скрипту, то оно вызывает CScript.exe, я его и не использую и соответственно скрипт не работает Smile

#364:  Author: FlasherLocation: Москва PostPosted: Thu Dec 14, 2017 14:25
    —
Нужно выполнить: cscript //H:WScript

#365:  Author: ingerard PostPosted: Thu Dec 14, 2017 14:52
    —
Flasher
Ну теперь оно ссылается нормально, только уже не видит TСScript:
Скриншот

А чем плохо что я делал? Положить рядом 2 файлика и не беспокоиться что что-то в системе не так...

#366:  Author: FlasherLocation: Москва PostPosted: Thu Dec 14, 2017 15:19
    —
ingerard
Так на скриншоте другой скрипт. Я же писал об условиях, сославшись на 8 п. памятки.

ingerard wrote:
Положить рядом 2 файлика и не беспокоиться что что-то в системе не так
1. При системном функционале в указании в комстроке интерпретатора нет необходимости.
2. При большом объёме скриптов в bar/ini забирается место.
3. Запуск от встроенного интерпретатора осуществляется немного быстрее, т. к. согласуется с реестром, а не с манифестом.

#367:  Author: ingerard PostPosted: Thu Dec 14, 2017 15:47
    —
Flasher wrote:
Так на скриншоте другой скрипт.

Так я тестирую скрипты, где требуется TCScript, вот с ними беда.

Flasher wrote:
Запуск от встроенного интерпретатора осуществляется немного быстрее

Хорошо согласен, только я не пойму как сделать чтоб заработало от встроенного.

#368:  Author: FlasherLocation: Москва PostPosted: Thu Dec 14, 2017 16:02
    —
ingerard wrote:
Так я тестирую скрипты, где требуется TCScript, вот с ними беда.
С ними его и надо использовать. Это же совершенно очевидно и, уже который раз повторяю, задано условием.
ingerard wrote:
Хорошо согласен, только я не пойму как сделать чтоб заработало от встроенного.
В каком случае? Я же в первом пункте написал "При системном функционале". С этим какие-то проблемы?

#369:  Author: ingerard PostPosted: Thu Dec 14, 2017 16:35
    —
Flasher
Я уже ничего не понимаю...
Вот скрипт.
Вот команда:
Code:
[em_ext_savetocliprelavpath]
cmd=%COMMANDER_PATH%\Addons\TCScript\wscript.exe %COMMANDER_PATH%\Scripts\RelativePath.vbs
menu=Копировать относительные пути выбранных объектов

При таком варианте все отлично работает, на любых системах, все портативно, регистрировать ничего отдельно не надо.

А вот при таком раскладе, ссылаясь на встроенный интерпретатор, все очень плохо, ошибки:
Команда:
Code:
[em_ext_savetocliprelavpath]
cmd=%COMMANDER_PATH%\Scripts\RelativePath.vbs
menu=Копировать относительные пути выбранных объектов


И я не пойму, из-за чего ошибка, почему она не видеть TCScript и что ее регистрировать постоянно надо?

#370:  Author: FlasherLocation: Москва PostPosted: Thu Dec 14, 2017 16:57
    —
ingerard
Такое ощущение, как будто я на каком другом языке только что всё объяснял.
Системный (он же встроенный) функционал не подразумевает задействования сторонних компонентов аля TCScript.dll. Именно в таких скриптах (а их здесь подавляющее большинство) не требуется переносной wscript.exe. Вы зачем-то опять приводите скрипт с применением TCScript.dll. Что тут может быть неясно-то? И что неясно в п. 8 памятки? Условие задано, используем переноску, не задано — не используем. Уже как КО разъясняю. Речь идёт исключительно о выборочном формировании кнопок и юзеркоманд, а не о наличии или отсутствии необходимых в некоторых ситуациях компонентов в сборке ТС.

#371:  Author: Dimsok PostPosted: Wed Feb 28, 2018 01:14
    —
Скрипт из этой темы
Нужна модификация, чтобы указывать данные для поиска и замены в параметрах кнопки, чтобы по нажатию на неё сразу осуществлялась замена. Желательно, чтобы была возможность задавать параметры для трёх условий замены. Например: "ночь" "день" горячо" "холодно" "+" "-".

#372:  Author: FlasherLocation: Москва PostPosted: Wed Feb 28, 2018 05:42
    —
Dimsok
Опять про первый пункт снизу памятки напомнить?

Code:
'====================== VBS ======================
' Многократная замена в выбранных текстовых файлах

' Параметры: %WL <строка поиска> <строка замены>
' Ключ учёта регистра: /cs

' Допустимо несколько строк поиска и замены.
' Пример: %WL country страна Russia Россия yes да
'=================================================
Option Explicit : Dim N, A, C, Title, FSO, List, F, All, i
If Not WSH.Arguments.Named.Exists("cs") Then N = 1
Set A = WSH.Arguments.UnNamed : C = A.Count
If C = 0 Then WSH.Quit
Title = " Замена текста в выбранных файлах      "
If C Mod 2 = 0 Then MsgBox _
"Нечётное число строк поиска и замены!", 4144, Title : WSH.Quit
Set FSO = CreateObject("Scripting.FileSystemObject")
Set List = FSO.OpenTextFile(A(0),,,-1)
Do : F = List.ReadLine
  If FSO.FileExists(F) Then
    All = FSO.OpenTextFile(F).ReadAll
    For i = 1 To C - 2 Step 2
      All = Replace(All, A(i), A(i + 1), 1, -1, N)
    Next
    With FSO.OpenTextFile(F, 2) .Write All : .Close : End With
  End If
Loop Until List.AtEndOfStream : List.Close
If i Then MsgBox "Выполнено!", 4160, Title
Впрочем, у nhrt (c автоопределением и выбором кодировок) есть -list, что может оказаться более предпочтительным.

#373:  Author: AvadaLocation: Россия, Саратов PostPosted: Wed Feb 28, 2018 06:55
    —
Dimsok
Замечание за оверквотинг. Код заменён ссылкой. Сто раз говорилось, что не надо дублировать полный текст скрипта.
От исходного кода то, что было приведено, отличалось только отсутствием (причём без всяких пояснений) строки
Code:
MsgBox "Поиск с заменой завершен!", vbInformation, "Поиск и замена"

#374:  Author: HEXFIXLocation: Калининград PostPosted: Sat Dec 01, 2018 21:33
    —
Всем доброго времени суток. Поиском пользовался, честно Smile
Заранее прошу извинить, если пишу не в тот топик.
Собственно, сам вопрос. У всех после обновления до Windows 10 October Update (1809) перестали работать все скрипты и кнопки, использующие TCWSHelp.exe, или это что-то глубоко личное?

#375:  Author: FlasherLocation: Москва PostPosted: Sat Dec 01, 2018 22:12
    —
HEXFIX
Наверно, это у мелкомягких что-то личное. Из TCx32 не работает?
С портабл-версией как?

#376:  Author: HEXFIXLocation: Калининград PostPosted: Sun Dec 02, 2018 17:54
    —
Ну, собственно, портабл версия 32 бит и есть. И не работает, да.
UPD. Неправильно понял. Думал, что портабл емеется в виду сам TC. Буду пробовать. Отпишусь о результатах

#377:  Author: HEXFIXLocation: Калининград PostPosted: Mon Dec 03, 2018 19:37
    —
Оказывается, я всё время пользовался портабельной версией и только что узнал об этом Smile
К сожалению, не работает

#378:  Author: FlasherLocation: Москва PostPosted: Mon Dec 03, 2018 19:55
    —
В смысле "узнал"? О таком невозможно не знать, если это не чужая сборка, конечно.
Дата модификации у dll какая? Пример кнопки с TCKB не работает? Интерпретатор откуда тянулся?

#379:  Author: HEXFIXLocation: Калининград PostPosted: Tue Dec 04, 2018 14:21
    —
Чаво-то я совсем запутался Smile
Нет у меня никакой .dll. Только файл TCWSHelp.exe. Не оно?
Пример не работающего скрипта:
Code:
'=======================================================
' Создание текстового файла с содержимым буфера обмена
'=======================================================
 
Option Explicit
Dim FileName
'========== Изменяемые параметры =======================
FileName = "Новый файл.txt" 'Имя создаваемого файла
'=======================================================
Dim TCS, Clip, Btn, FSO, OTL, Mess, Title
Set TCS = CreateObject("TCScript.Helper")
Clip = TCS.GetTextFromClip
Set TCS = Nothing
 
If Len(Clip) > 0 Then
Set FSO = CreateObject("Scripting.FileSystemObject")
If FSO.FileExists(FileName) Then
Mess = "Буфер обмена содержит текст." & vbNewLine & _
"Заменить содержимое файла " & FileName & _
" текстом из буфера обмена?" & vbNewLine
Title = "Замена содержимого файла"
Else
Mess = "Буфер обмена содержит текст." & vbNewLine & _
"Создать файл " & FileName & _
" с содержимым буфера обмена?" & vbNewLine
Title = "Создание текстового файла"
End If
Btn = MsgBox(Mess, vbYesNo + vbQuestion, Title)
If Btn = 7 Then 'Кнопка No
Set FSO = Nothing
WScript.Quit
End If
Else
WScript.Quit
End If
 
Set OTL = FSO.OpenTextFile(FileName, 2, True)
OTL.Write Clip
OTL.Close
 
Set OTL = Nothing
Set FSO = Nothing
WScript.Quit

UPD. Скачал готовую сборку для TC c tckb.ru, закинул в папку TC, скопировал в эту же папку wscript.exe из system32, перезагрузил комп — не работает


Last edited by HEXFIX on Tue Dec 04, 2018 14:37; edited 1 time in total

#380:  Author: FlasherLocation: Москва PostPosted: Tue Dec 04, 2018 14:32
    —
HEXFIX wrote:
Не оно?
Нет, конечно. Это то, что и было, никакой не Portable. Ссылка на статью дана в первом посте темы.

#381:  Author: HEXFIXLocation: Калининград PostPosted: Tue Dec 04, 2018 14:38
    —
Пока редактировал свой пост ты уже ответил Smile

#382:  Author: FlasherLocation: Москва PostPosted: Tue Dec 04, 2018 18:14
    —
HEXFIX wrote:
скопировал в эту же папку wscript.exe из system32, перезагрузил комп — не работает
10-ка 32-битная что ли? Перезагружать ничего не надо. Сперва надо разрегистрировать TCWSHelp.exe. Интерпретатор использовать лучше этот.

#383:  Author: HEXFIXLocation: Калининград PostPosted: Fri Dec 07, 2018 15:49
    —
Нет, 64-bit.
Ну ОК, скопировал файл из SysWOW54. Не работает.
ЗЫ. Да, проверил под виндами 1803. Всё работает, как часики.
ЗЫЫ. Ссылка на интерпретатор не открывается

#384:  Author: FlasherLocation: Москва PostPosted: Fri Dec 07, 2018 19:50
    —
Ссылка с TCKB рабочая, проверял при выкладке.

#385:  Author: AvadaLocation: Россия, Саратов PostPosted: Sat Dec 08, 2018 08:41
    —
HEXFIX
Принципиальное неиспользование в последних фразах постов точек запрещено правилами форума и придаёт сообщениям недописанный вид. Категорически прошу прекратить эту практику.

#386:  Author: rediffusion PostPosted: Tue Mar 12, 2019 00:57
    —
Flasher wrote:
Ссылка на статью дана в первом посте темы.


Уже 3 дня мучаюсь, пора спросить!
Ну перешёл на ваш сайт. Прочитал несколько раз статью (сайт кстати то работает то нет).

1. ¦
wscript.exe - перебросил в папку из "%Windir%\SysWOW64" в "TCHelper" (в которой всё, что скачал с вашего сайта).
2. ¦
Есть плагин "FileInfo".
 Hidden text

1) Данные tlbid и clsid брать из вашего "TCScript.dll"? Этих uuid там целых 3 штуки.
Хорошо tlbid - он записан вверху.
Ну а этот clsid - в каком низу? Ниже самого первого? Или он самый последний? И да clsid - это тоже начинается на uuid (только ниже) или запись должна начинаться вот с таких строк "clsid" и потом что-то? Если да то такова слова нет "clsid".
3. ¦
А можно uuid брать с других .dll например тех которые расположены по вот такому пути "%Windir%\SysWOW64"?

P.S.
Кстати заметил что некоторые .vbs скрипты работают и без "TCHelper".

#387:  Author: FlasherLocation: Москва PostPosted: Tue Mar 12, 2019 06:37
    —
rediffusion
1. Вообще у TCScript.dll есть своя тема. Для каких целей он понадобился?
2-3. Это не для вас, а для WSH/COM/OLE-разработчиков.

rediffusion wrote:
Кстати заметил что некоторые .vbs скрипты работают и без "TCHelper".
Да неужели?

Last edited by Flasher on Sat Mar 16, 2019 12:49; edited 1 time in total

#388:  Author: rediffusion PostPosted: Tue Mar 12, 2019 20:10
    —
Flasher

"TCWSHelper" - и всё же весь день провозился! Эти все файлы мне пригодятся в дальнейшем? Стоит оставлять? Посоветуйте что оставить а что удалить?
Quote:
DemoScripts\
wscript.exe.manifest
wscript.exe
TCWSHelp.exe
TCScript.sxs.manifest
TCScript.dll
SendKeystroke.txt
ReadMe.txt

#389:  Author: FlasherLocation: Москва PostPosted: Tue Mar 12, 2019 20:25
    —
rediffusion
Вопрос лишь в том, будут ли использоваться скрипты с указанием Хелпера. Советую забить TCScript.dll в поиск по разделу. Если что-то приглянётся, то оставлять стоит всё, кроме TCWSHelp.exe, который нужно перед удалением разрегистрировать.
DemoScripts\ — папка с тестовыми скриптами от старого Хелпера. Её (если есть желание изучать коды) логично оставить в первозданном виде и закинуть в %TC%\Scripts\Components\ с остальными файлами. Вместо Components логичны ещё такие варианты: ActiveX, OLEObjects.

#390:  Author: Baltazar PostPosted: Wed Sep 16, 2020 03:45
    —
На базе когда-то найденного в сети (а может и здесь на форуме) скрипта, предназначенного для копирования путей с кавычками
Code:
Option Explicit
Dim Delimiter
Delimiter = vbNewLine
Dim TempFile, TCS
Set TempFile = CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.Arguments(0), 1)
Set TCS = CreateObject("TCScript.Helper")

Dim StrInFile, FileNames, M1
FileNames = ""
Do While Not TempFile.AtEndOfStream
  StrInFile = TempFile.ReadLine
  StrInFile = chr(34) & StrInFile & chr (34)
  FileNames = FileNames & StrInFile & Delimiter
Loop
TCS.SetTextToClip(Left(FileNames, Len(FileNames) - Len(Delimiter)))
Set TempFile = Nothing
Set TCS = Nothing
Wscript.Quit
пытался путём обработки регекспами организовать для определённых ftp-серверов (с определёнными ip-адресами) подмену, дабы в конечном итоге при копировании получался локальный для ftp путь. Вот только в итоге обнаружилось, что через %L скрипту передаются пути без адреса сервера и регекспам тупо нечего обрабатывать. Как быть в данном случае ? Существует ли переменная или типа того, которая позволит использовать в скрипте адреса ftp-серверов и пустить их в обработку ? В vbs я не мастак, а уж тем более в vbs с нюансами TCScript Shocked .

#391:  Author: ingerard PostPosted: Mon Sep 28, 2020 21:45
    —
Перестали работать некоторые скрипты. Выяснил что команда GetSrcSelectedFiles нормально не работает. Возможно из-за обновленной системы. Что подскажете делать?

TCScript.dll 1.0.0.15
wscript.exe 5.8.7601.18283
Windows 10 Professional (Build 18363) 1909, Fall 2019
TC 32bit


Один из скриптов.
Code:

'=========================== VBS ============================
' Выделение в другой панели одноимённых с выбранными объектов
' Условие: требуется компонент TCScript.dll
'============================================================
With CreateObject("TCScript.Helper")
  .Pause = 0 : .Wait = True : Clip = .GetTextFromClip
  .LockTC True : .NoArrayReturn = True: If .GetInfo("TP") = "" Then _
  .SetTextToClip .GetSrcSelectedFiles(1) Else _
  .SetTextToClip Replace(.GetSrcSelectedFiles(1), .GetInfo("SP"), "")
  .SendCommand 4006, True : .SendCommand 2033, True
  .SendCommand 4006, True : .LockTC False : .SetTextToClip Clip
End With


Как временную замену команде - сделал так:
Code:
  .SendCommand 2018, True
  .Sleep(10)
  Sel = .GetTextFromClip

#392:  Author: l3xrom PostPosted: Sun Mar 07, 2021 22:03
    —
Здравствуйте!
Помогите пожалуйста разобраться, как объединить папки с одинаковым началом имени. Чтобы степень похожести имён определялась по количеству первых символов и была возможность регулировать это количество в параметрах.

из вот такого состояния:
Code:
\[...] 
   \Black
   \Black001
   \Black Grey
   \Black_ghweyw
   \White
   \WhiteCloud
   \White paper
   \White_kytltdte
они перешли в такое:
Code:
\[...]
   \Black
      \Black001
      \Black Grey
      \Black_ghweyw
   \White
      \WhiteCloud
      \White paper
      \White_kytltdte

Пробовал групповое переименование в надежде, что они схлопнутся, как в Проводнике Windows, но нет. Я что-то даже начал вручную, но после 2-х часов такого экшена, сдался.

А в идеале, сделать ещё 2-ую реализацию с добавлением к предыдущему того, чтобы после объединения, все файлы из дочерних папок переместились в корневую. При совпадении имён файлов - не заменять.
из вот такого состояния:
Code:
\[...] 
   \Black
   ..\gdsg.jpg
   ..\tjytk.jpg
      \Black001
      ..\here2.jpg
      ..\рр11.jpg
      \Black Grey
      ..\ерьл1.jpg
      ..\оекл.jpg
      \Black_ghweyw
      ..\hfeh.jpg
      ..\kylku.jpg
они перешли в такое:
Code:
\[...]
   \Black
   ..\gdsg.jpg
   ..\tjytk.jpg
   ..\here2.jpg
   ..\рр11.jpg
   ..\here2.jpg
   ..\рр11.jpg
   ..\ерьл1.jpg
   ..\оекл.jpg
   ..\hfeh.jpg
   ..\kylku.jpg
      \Black001
      \Black Grey
      \Black_ghweyw

#393:  Author: BatyaLocation: Москва, Россия PostPosted: Thu May 06, 2021 12:30
    —
l3xrom wrote:
Помогите пожалуйста разобраться, как объединить папки с одинаковым началом имени. Чтобы степень похожести имён определялась по количеству первых символов и была возможность регулировать это количество в параметрах.

Хм... Что-то тухло стало на форуме. За 2 месяца никто не ответил.
Требуемое можно выполнить не скриптом, а через инструмент группового переименования.
Выделить все папки -> Открыть ИГП -> Ввести маску "[N1-5]\[N]" -> Выполнить
Если перед запуском ИГП будут выделены базовые папки (Black, White), переименование в ИГП по ним выдаст ошибку. Но это как раз и нужно, чтобы по ним ничего не выполнялось.

l3xrom wrote:
А в идеале, сделать ещё 2-ую реализацию с добавлением к предыдущему того, чтобы после объединения, все файлы из дочерних папок переместились в корневую.

Здесь также используется ИГП. Для выделенных файлов нужно применить маску "..\[N]".

#394:  Author: Baltazar PostPosted: Thu Jul 29, 2021 10:14
    —
Нашёл на форуме скрипт который идеально подошёл под мой прошлый запрос



Total Commander -> Автоматизация Total Commander


output generated using printer-friendly topic mod. All times are GMT + 4 Hours

Page 1 of 1

Powered by phpBB © 2001, 2005 phpBB Group