WSH + TCScript = мощное средство автоматизации TC!

Форум о самом популярном файловом менеджере Total Commander

Сообщение Volniy » Чт сен 09, 2004 1:41 pm

Ну если уж так нравится xcopy, тогда :
Код: выделить все
Set WshShell = WScript.CreateObject("WScript.Shell")
Return = WshShell.Run("xcopy /?", 1, true)
Set WshShell = Nothing
MsgBox "Понятна идея?"
Volniy
Ст. лейтенант
 
Сообщений: 121
Зарегистрирован: Сб ноя 22, 2003 11:42 pm
Пункты репутации: 0

Сообщение Ti-Mac » Чт сен 09, 2004 2:25 pm

А для надёжности лучше
Код: выделить все
Return = WshShell.Run("cmd.exe /c xcopy /?", 1, true)
<span style='color:blue'>Formating C: .................98%</span>
<span style='color:red'>Fatal Error:</span> <span style='color:blue'>found Windows</span>
Ti-Mac
Капитан
 
Сообщений: 168
Зарегистрирован: Вс апр 18, 2004 8:18 am
Откуда: Кемерово
Пункты репутации: 0

Сообщение Batya » Чт сен 09, 2004 2:35 pm

2Volniy, Ti-Mac
Спасибо, но я это уже использую. Хотель что-нибудь виндоподобное. Типа такого:
Код: выделить все
Set FSO = CreateObject("Scripting.FileSystemObject")
Set OS  = CreateObject("Shell.Application")
Set OF = OS.NameSpace(FSO.CreateFolder("C:\NewFolder"))
OF.CopyHere "C:\OldFolder\*.*", False

Только при этом еще копируются вложенные папки, а мне этого не надо.
Batya
Ст. лейтенант
 
Сообщений: 146
Зарегистрирован: Вт апр 29, 2003 8:28 am
Откуда: Москва
Пункты репутации: 0

Сообщение Volniy » Пт сен 10, 2004 11:12 am

<!--QuoteBegin-Ti-Mac+--><div class='quotetop'>QUOTE(Ti-Mac)</div><div class='quotemain'><!--QuoteEBegin-->А для надёжности лучше
Return = WshShell.Run("cmd.exe /c xcopy /?", 1, true)
<!--QuoteEnd--></div><!--QuoteEEnd-->
Так это на Win9x надежно не сработает <!--emo&:)-->[img]style_emoticons/<#EMO_DIR#>/smile.gif[/img]<!--endemo-->. А надежно imho будет вот так
Код: выделить все
Return = WshShell.Run("%comspec% xcopy /?", 1, true)

2Batya
<a href='http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/objects/folder/copyhere.asp' target='_blank'>Фрагментик только, а взят он тут</a>
<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->CopyHere Method

Copies an item or items to a folder.
Syntax
Folder.CopyHere(vItem [, vOptions])
Parameters
vItem Required. Specifies the item or items to copy. This can be a string that represents a file name, a FolderItem object, or a FolderItems object.
vOptions Optional. Specifies options for the copy operation. This value can be zero or a combination of the following values. These values are based upon flags defined for use with the fFlags member of the C++ SHFILEOPSTRUCT structure. These flags are not defined as such for Microsoft Visual Basic, Visual Basic Scripting Edition (VBScript), or Microsoft JScript, so you must define them yourself or use their numeric equivalents.
4 Do not display a progress dialog box. 
8 Give the file being operated on a new name in a move, copy, or rename operation if a file with the target name already exists. 
16 Respond with "Yes to All" for any dialog box that is displayed. 
64 Preserve undo information, if possible.
128 Perform the operation on files only if a wildcard file name (*.*) is specified. 
256 Display a progress dialog box but do not show the file names. 
512 Do not confirm the creation of a new directory if the operation requires one to be created. 
1024 Do not display a user interface if an error occurs. 
2048 Version 4.71. Do not copy the security attributes of the file.
4096 Only operate in the local directory. Don't operate recursively into subdirectories.
9182 Version 5.0. Do not copy connected files as a group. Only copy the specified files.
<!--QuoteEnd--></div><!--QuoteEEnd-->

Обрати внимание на константу = 4096 <!--emo&;)-->[img]style_emoticons/<#EMO_DIR#>/wink.gif[/img]<!--endemo-->
Последний раз редактировалось Volniy Пт сен 10, 2004 3:11 pm, всего редактировалось 1 раз.
Volniy
Ст. лейтенант
 
Сообщений: 121
Зарегистрирован: Сб ноя 22, 2003 11:42 pm
Пункты репутации: 0

Сообщение Batya » Пт сен 10, 2004 3:36 pm

2Volniy
Огромное спасибо!!! После отпуска попробую.
Batya
Ст. лейтенант
 
Сообщений: 146
Зарегистрирован: Вт апр 29, 2003 8:28 am
Откуда: Москва
Пункты репутации: 0

Сообщение K2D » Пн окт 04, 2004 12:16 pm

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

'Option Explicit
On Error Resume Next
Dim strComputer, objArgs
Dim objUser, i
Dim pass, text

strComputer = "."

Set objArgs = WScript.Arguments
For i = 0 To objArgs.Count -1
pass = text & objArgs(i)

Set objUser = GetObject("WinNT://" & strComputer & "/Administrator,user")
objUser.SetPassword pass
objUser.SetInfo
Next
Последний раз редактировалось K2D Пн окт 04, 2004 12:16 pm, всего редактировалось 1 раз.
K2D
Призывник
 
Сообщений: 2
Зарегистрирован: Ср сен 22, 2004 11:43 am
Пункты репутации: 0

Сообщение Volniy » Вс окт 17, 2004 9:32 pm

Если кто помнит еще про мой Helper, попробуйте его обновление <a href='http://wincmd.ru/files/tcwshelp_b6.zip' target='_blank'> до шестой бетки</a> (уж больно дождливым сегодня выдался денек <!--emo&:)-->[img]style_emoticons/<#EMO_DIR#>/smile.gif[/img]<!--endemo--> ).
Изменения/добавления:
<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->Wait=True/False
глобальное  свойство,  которое  определяет,  будут  ли  для отсылки  команд  Тоталу  использоваться  функции  PostMessage (по умолчанию,  Wait=False) или  SendMessage (при установке значения True). Попутно в SendCommand добавлен опциональный параметр для переопределения глобального свойства для текущей команды.

SetFileDateAtr(File, [Created, [LastAccessed, [LastModified, [Atributes]]]])
метод,  позволяющий  установить даты и атрибуты указанного файла. В качестве любого из параметров также может  передаваться и ссылка  на объект типа File. При этом  автоматически  будут  использованы соответствующие свойства файла, хранимые в объекте.

ClearClip
метод, который просто  опустошает  буфер  обмена  Windows, освобождая занимаемую им память

Helper слегка переименован, чтобы его не путали с чужим продуктом (TCScript)
<!--QuoteEnd--></div><!--QuoteEEnd-->
Volniy
Ст. лейтенант
 
Сообщений: 121
Зарегистрирован: Сб ноя 22, 2003 11:42 pm
Пункты репутации: 0

Сообщение lef » Вт окт 19, 2004 11:04 am

А нельзя ли сделать какой-нибудь внутренний тест на то, что Helper'у известно местонахождение inc файла, и выдавать соответственную ошибку, в зависимости от которой я вызвал бы диалог указания пути к файлу или мог бы обойти выполнение операторов TCS.SendCommand использующих имя команды вместо номера или еще как среагировать.
lef
Ефрейтор :)
 
Сообщений: 10
Зарегистрирован: Пт июл 23, 2004 5:23 pm
Пункты репутации: 0

Сообщение Volniy » Вт окт 19, 2004 1:06 pm

Видимо проще всего будет проверить, что находится в свойстве TCPath. Если же там пусто, значит и inc файл не найден тоже, так как он определяется как TCPath + "\TOTALCMD.INC". Подойдет такая проверка?
Ну а чтобы TCPath не был пустым, нужно чтобы в реестре были указаны верные пути или скрипт был запущен из-под Тотала. Еще поможет в этом случае размещение файла Helper-а в папке Тотала.
Volniy
Ст. лейтенант
 
Сообщений: 121
Зарегистрирован: Сб ноя 22, 2003 11:42 pm
Пункты репутации: 0

Сообщение SAM » Вт окт 19, 2004 1:17 pm

2Volniy
Рад что Helper развивается <!--emo&:)-->[img]style_emoticons/<#EMO_DIR#>/smile.gif[/img]<!--endemo-->
(надо будет что нибудь написать с его использованием <!--emo&:)-->[img]style_emoticons/<#EMO_DIR#>/smile.gif[/img]<!--endemo-->
Маленькое замечание:
В дистрибутиве - нерабочий пример перезапуска ТС
(ошибка в том, что скрипт не ждет TCS.IsRunningTC = False)
Отсюда - предложение - сделать чтоб ждал (чтобы цикл не писать)
SAM
Старшина
 
Сообщений: 45
Зарегистрирован: Пн май 24, 2004 5:33 am
Пункты репутации: 0

Сообщение Volniy » Вт окт 19, 2004 2:20 pm

<!--QuoteBegin-SAM+Oct 19 2004, 16:17--><div class='quotetop'>QUOTE(SAM @ Oct 19 2004, 16:17)</div><div class='quotemain'><!--QuoteEBegin-->В дистрибутиве - нерабочий пример перезапуска ТС<!--QuoteEnd--></div><!--QuoteEEnd-->
Может он и нерабочий, только он у меня, почему-то, работает <!--emo&:)-->[img]style_emoticons/<#EMO_DIR#>/smile.gif[/img]<!--endemo-->
А у тебя?
<!--QuoteBegin-SAM+--><div class='quotetop'>QUOTE(SAM)</div><div class='quotemain'><!--QuoteEBegin-->(ошибка в том, что скрипт не ждет TCS.IsRunningTC = False)
<!--QuoteEnd--></div><!--QuoteEEnd-->
Не ждет, а просто проверяет, чтобы не запустить второй экземпляр, если первый почему-либо не закрылся. При желании можно добавить задержку.

С другой стороны в скрипте написано
TCS.SendCommand "cm_Exit", True
а это значит, что дальнейшая работа скрипта будет происходить лишь только после того, как окно Тотала сообщит, что оно приняло сообщение о закрытии программы. Собственно, для демонстрации использования этого необязательного параметра этот простейший скрипт и был написан. Конечно, его можно и развить. Только это никчему, ибо уже есть Тотальных перезапускалок и вродебы их достаточно.

Прошу прощения, но написать новый demo-скрипт мне разгона не хватило...
Volniy
Ст. лейтенант
 
Сообщений: 121
Зарегистрирован: Сб ноя 22, 2003 11:42 pm
Пункты репутации: 0

Сообщение SAM » Ср окт 20, 2004 5:07 am

2Volniy
Х.з.
Написано и у меня TCS.SendCommand "cm_Exit", True
Только не ждет он <!--emo&:(-->[img]style_emoticons/<#EMO_DIR#>/sad.gif[/img]<!--endemo--> Баг?
Приходится вот так:
Код: выделить все
   'Завершаем работу ТС
   TCS.SendCommand "cm_Exit", True

   'Ожидание завершения работы ТС
   Do
 WScript.Sleep 100
   Loop While TCS.IsRunningTC

   'Запускаем новый экземпляр программы
   WshShell.Run TCexe


Ах, да! Очень приятно, что WSH Helper ActiveX for Total Commander стал меньше по размеру <!--emo&:)-->[img]style_emoticons/<#EMO_DIR#>/smile.gif[/img]<!--endemo-->
SAM
Старшина
 
Сообщений: 45
Зарегистрирован: Пн май 24, 2004 5:33 am
Пункты репутации: 0

Сообщение Volniy » Ср окт 20, 2004 12:23 pm

<!--QuoteBegin-SAM+Oct 20 2004, 08:07--><div class='quotetop'>QUOTE(SAM @ Oct 20 2004, 08:07)</div><div class='quotemain'><!--QuoteEBegin-->Написано и у меня TCS.SendCommand "cm_Exit", True
Только не ждет он  Баг?
<!--QuoteEnd--></div><!--QuoteEEnd-->
Да нет, это никакой не баг! Я хочу чуть более подробно объяснить суть параметра Wait и одноименного глобального свойства Helper-a. Даже если мы и выставляем его значение в True это еще не значит, что мы заставляем рапортовать сам Total, что он успешно выполнил посланую нами команду. Это было бы возможно только в случае, если бы Тотал имел настоящий API для внешнего управления им (тоесть он реально желал рапортовать нам об выполнении). На самом деле мы только можем быть уверены что мы послали главному окну Тотала сообщение и оно было им получено, а не просто поставлено в очередь сообщений, как это произошло бы в случае когда бы мы указали вторым пароаметром False.

Что касается твоего примера с ожиданием выгрузки Тотала, то в нем есть опасность войти в вечный цикл, если по каким-то причинам он не будет закрыт (например, если будет что-то из архива запущено и Тотал не захочет закрываться автоматом). ПОэтому нужно добавить еще и таймаут ожидания. Например вот так:

Код: выделить все
  Option Explicit
  Dim TCS, WshShell, TCexe, Timeout, QuitByTimeOut
  Set TCS = CreateObject("TCScript.Helper")
  Set WshShell = WScript.CreateObject("WScript.Shell")
  TCexe = """" & TCS.TCPath & "\totalcmd.exe"""
  'Завершаем работу ТС
  TCS.SendCommand "cm_Exit", True
 
  'Ожидание завершения работы ТС
  Timeout = 5000 ' Сколько ждать выключения в мсек
  Do
     Timeout = Timeout - 100
     If Timeout < 0 Then QuitByTimeOut = True: Exit Do
     WScript.Sleep 100
  Loop While TCS.IsRunningTC
 
  'Запускаем новый экземпляр программы
  If Not QuitByTimeOut Then WshShell.Run TCexe
 
  Set TCS = Nothing
  Set WshShell = Nothing
  WScript.Quit
Volniy
Ст. лейтенант
 
Сообщений: 121
Зарегистрирован: Сб ноя 22, 2003 11:42 pm
Пункты репутации: 0

Сообщение SAM » Ср окт 20, 2004 2:17 pm

2Volniy
Да. По твоему - правильней <!--emo&:)-->[img]style_emoticons/<#EMO_DIR#>/smile.gif[/img]<!--endemo-->
Отсюда мАленькое предложение - встроить цикл внутрь Helper-а
тогда бы было просто:
If Not TCS.IsRunningTC Then WshShell.Run TCexe
SAM
Старшина
 
Сообщений: 45
Зарегистрирован: Пн май 24, 2004 5:33 am
Пункты репутации: 0

Сообщение lef » Ср окт 20, 2004 3:20 pm

<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->Видимо проще всего будет проверить, что находится в свойстве TCPath. Если же там пусто, значит и inc файл не найден тоже, так как он определяется как TCPath + "\TOTALCMD.INC". Подойдет такая проверка?<!--QuoteEnd--></div><!--QuoteEEnd-->
Сойдет, а то для меня оба файла примеров оказываются нерабочими без дополнительного их ковыряния
<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->Ну а чтобы TCPath не был пустым, нужно чтобы в реестре были указаны верные пути или скрипт был запущен из-под Тотала.<!--QuoteEnd--></div><!--QuoteEEnd-->
Из под него и запускаю, правда в реестре скорее всего пусто.
<!--QuoteBegin--><div class='quotetop'>QUOTE</div><div class='quotemain'><!--QuoteEBegin-->Еще поможет в этом случае размещение файла Helper-а в папке Тотала.<!--QuoteEnd--></div><!--QuoteEEnd-->Попробую. Правда у меня их несколько, в каждый что-ли запихнуть по Helper'у?

Надо бы обо всем этом в Readme написать <!--emo&:)-->[img]style_emoticons/<#EMO_DIR#>/smile.gif[/img]<!--endemo-->
lef
Ефрейтор :)
 
Сообщений: 10
Зарегистрирован: Пт июл 23, 2004 5:23 pm
Пункты репутации: 0

Пред.След.

Вернуться в Total Commander

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19

cron