Windows Script Host

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

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

Аватара пользователя
mozers
Сообщения: 82
Зарегистрирован: Чт дек 16, 2004 13:14
Откуда: с Нижнего
Контактная информация:

Сообщение mozers »

m> 3. Какого хрена cm_ConfigChangeIniFiles открывает файлы только в
m> Блокноте ? Умнее было бы использовать редактор, заданный в
m> параметре "Editor=" wincmd.ini И уж если там ничего не задано то
m> тогда только notepad.
m> В свете последних решений, к wincmd.ini и ftp.ini можно бы добавить
m> usercmd.ini

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

Теперь пишем в usercmd.ini

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

[em_configChangeIniFiles]
cmd=%COMMANDER_PATH%\Utils\WSH\em_configChangeIniFiles.js
И заменяем в WINCMD.MNU так задолбавшую команду на нашу:

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

MENUITEM "Р&едактировать файлы конфигурации", em_configChangeIniFiles
Радуемся жизни :)
Аватара пользователя
Bomm
Сообщения: 245
Зарегистрирован: Сб янв 15, 2005 14:39
Откуда: Москва

Сообщение Bomm »

Я в скриптах не большой специалист, скорей маленький :)
Смотрю. с помощью данного скрипта (спасибо mozers за него!!!) у меня не загружается <файл>.mnu
Начал анализировать и выяснил, что команда ReadINI чувствительно к реестру, и в скрипте написано
var wincmd_mnu = ReadINI (wincmd_ini, 'MainMenu','');
а у меня в wincmd.ini - 'Mainmenu'
Причем я не сам вроде бы писал, это TC записал так :wink:
Исправил - заработало!

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

Вот такое, как мне кажется, конструктивное замечание...
Юрий Бомштейн
Аватара пользователя
mozers
Сообщения: 82
Зарегистрирован: Чт дек 16, 2004 13:14
Откуда: с Нижнего
Контактная информация:

Сообщение mozers »

2Bomm
Спасибо за верное замечание :) Вот НОВАЯ ВЕРСИЯ
Если бы у Вас стоял Script Helper (c)Volniy то эту ошибку Вы бы не обнаружили ;)
Аватара пользователя
aLexx
Сообщения: 442
Зарегистрирован: Пн мар 14, 2005 08:33
Откуда: Новокузнецк
Контактная информация:

Сообщение aLexx »

Очень долгое время пользуюсь скриптом от Volniy для маркировки файлов через один (зеброй).
Но меня очень выламывало перед вызовом этого скрипта выделять всё, а уж потом запускать его.
Творчески подойдя к процессу, слегка переделал этот скрипт.

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

' 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
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

aLexx писал(а):.
Творчески подойдя к процессу, слегка переделал этот скрипт.
Ну и я тоже переделал :roll: . Вариант без использования промежуточного файла:

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

' 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
Аватара пользователя
aLexx
Сообщения: 442
Зарегистрирован: Пн мар 14, 2005 08:33
Откуда: Новокузнецк
Контактная информация:

Сообщение aLexx »

Красава! А сразу нельзя было так сделать? :)

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

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

' 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
Это только пинок для творчества. Можно добавить, куда сохранять получаемый текстовый файл
(даже вторым параметром), можно сделать имя файла по имени каталога и т.д.
Pazzi
Сообщения: 5
Зарегистрирован: Сб авг 25, 2007 02:36

Сообщение Pazzi »

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

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

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

3. После копирования вывожу вывожу сообщение, что все успешно закончилось WScript.Echo(finalReport); так сообщение появляется свернутым или просто на заднем плане, на таскбаре кароче мигает,а фокус у тотала. переделал вывод сообщения на var vbSystemModal=4096; wsh.Popup(finalReport,0,"Success report",vbSystemModal); так сообщение конечно появляется поверх всех окон, но фокус всеровно теряет, что оч странно для модального окна... в чем проблема?
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

1. Вряд ли время копирования так уж увеличится, если копироваться будут одновременно несколько файлов (если конечно источником файлов будет не CD/DVD). Я, конечно, не знаю, как там у тебя выдается команда на копирование, но если обрабатывать все файлы в одном скрипте, то копирование будет происходить последовательно - пока предыдущий не скопируется, следующий не начнет копироваться.

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

3. vbSystemModal пришла еще с 16-битного API. Там это был действительно модальный результат - все приложения были недоступны пока не закроется мессага, показанная с такой константой. Ну, а в Win32 vbSystemModal гарантирует только, что окно сообщений будет показано поверх окон всех других приложений, но не более того:
Документация MSDN писал(а):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.
Pazzi
Сообщения: 5
Зарегистрирован: Сб авг 25, 2007 02:36

Сообщение Pazzi »

1. цикл приблизительно такой:

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

do
{
   nextFile=FilesList.Readline();

   var fFile=fso.GetFile(nextFile;

   fFile.Copy(path,false);
   WScript.Sleep(200);
}
while(!FilesList.atEndOfStream)
FilesList - это то что параметром %L передается.

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

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

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

Сообщение Volniy »

Pazzi писал(а):1. цикл приблизительно такой:

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

do
{
   nextFile=FilesList.Readline();

   var fFile=fso.GetFile(nextFile;

   fFile.Copy(path,false);
   WScript.Sleep(200);
}
while(!FilesList.atEndOfStream)
Нету никакого смысла в создании объекта File если нужно только скопировать файл. FSO имеет для этого специальный метод:

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

{
   nextFile=FilesList.Readline();
   fso.CopyFile (nextFile, path, false);
   WScript.Sleep(200);
}
Насчет задержки могу только предположить (IMHO), что системе нужно некоторое время, чтобы посливать файловые буфера на диск.
Pazzi писал(а):2. в идеале конеш чтоб показывалось и для каждого файла, какая его часть уже скопировалась) может можно как-то копировать вызовом виндосной апи-функции с сопутствующим открытием стандартного окна копирования?
В принципе стандартный шелловский диалог копирования можно вызывать, просто вызывая шелловскую функцию копирования. Для этого даже существует специальный объект:

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

var oShell = WScript.CreateObject("Shell.Application");
готового примера использования не дам, я как-то не пользовался сам. Так что примеры поищи в сети.
Вот, например. Только что нашел Гуглом: http://www.script-coding.info/WSH/Shell.html
Пример взят именно оттуда (правда тут VB синтаксис, но думаю разберешься):

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

Set objShellApp = CreateObject("Shell.Application")
Set objFolder = objShellApp.NameSpace("C:\WINDOWS")
objFolder.CopyHere("C:\AUTOEXEC.BAT")
Pazzi писал(а):3. тоесть модальным окно никак не сделать?
Из скрипта? Это врядли. Скриптовые возножности в этом плане очень сильно ограничены. Это же фактически набор команд, при чем тут визуальный интерфейс? Ну мессадж бокс можно показать, ну окошко ввода строки, и это практически все. Хочешь GUI из скрипта - добавляй внешние визуальные объекты. Хотя, имхо, тут уж будет естественнее переходить на какой-то из языков программирования, позволяющий создавать графический интерфейс.
Pazzi писал(а):а фокус почему может терятся?
А хз, видимо какое-то приложение затребовало его. У тебя же много чего одновременно работает. Кстати, я попробовал у себя запустить подобный скрипт и у меня такой потери фокуса после показа мессаги не происходит...
Pazzi
Сообщения: 5
Зарегистрирован: Сб авг 25, 2007 02:36

Сообщение Pazzi »

Спасибо за помощь, Volniy!
и за хелпер тоже респект)
Pazzi
Сообщения: 5
Зарегистрирован: Сб авг 25, 2007 02:36

Сообщение Pazzi »

не работает пример из книги Борна (самый последний в chapter 9).
ошибка возникает на строчке

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

oIE.Document.ValidForm.fRemark.Value = "No remarks"
пишет "обьект не поддерживает это свойство или метод: 'Document.ValidForm' "
кто-нибудь знает в чем проблема?
как обращаться к элементам формы?
Аватара пользователя
Batya
Сообщения: 2237
Зарегистрирован: Ср дек 15, 2004 09:51
Откуда: Москва, Россия

Сообщение Batya »

"Нда... Давно не брал я шашки в руки"

Pazzi
Попробуй так:

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

oIE.Document.GetElementByID("fRemark").Value = "No remarks"
Нет, я не сплю. Я просто медленно моргаю.
Victor_Dobrov
Сообщения: 50
Зарегистрирован: Вт июл 15, 2008 19:21

Сообщение Victor_Dobrov »

Сделал скрипт, переключающий фильтры или показывающий в тек. панели файлы того же типа, который перетащили на кнопку.

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

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

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

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

Сообщение Batya »

Интересный подход.

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