Автоматизированное копирование

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

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

Аватара пользователя
kefirux
Сообщения: 20
Зарегистрирован: Вт дек 09, 2008 22:26
Контактная информация:

Автоматизированное копирование

Сообщение kefirux »

Здравствуйте, гуру автоматизации!
недавно маниакально решил заняться автоматизацией процессов на
своём компе. так вот появилась задача которую я пробывал батником решить:
вставляю Карту памяти в картридер
1) создать на харддиске папку с текущей датой (в идеале конечно нужен запрос на имя папки, но ниасилил я такую фигню провернуть)
2) потом заходим на карту памяти и надо скопировать из всех папок файлы в ту папку которую я только что создал (не сами папки, а файлы из них)
в батнике это у меня получилось вот так:

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

cd /d "X:\- ПАКИ"
md %date%
cd %date%
for /D %f in (F:\Dcim\*.*) do cd %f && xcopy %f\*.* . /s /e /r && cd ..
но проблемы появились:

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

C:\WINDOWS>cd /d "X:\- ПАКИ"
X:\- ПАКИ>md 09.12.2008
X:\- ПАКИ>cd 09.12.2008
Непредвиденное появление: \Dcim\*.*).
X:\- ПАКИ\09.12.2008>for /D \Dcim\*.*) do cd f\*.* . /s /e /r && cd ..
(причём если тупо выполнять этот код без батника то всё работает)
и я подумал что Тотал Коммандер ведь имхо создан для таких дел!
ну в совокупности с JavaScript или VBScript уж тем более)
что нужно:
1) загрузка тотала с /L="X:\- ПАКИ" /R="F:\Dcim"
где L - хранилище данных. там и надо создавать папку
а R - собственно ФлешКарта (в каталоге Dcim идут папки 8282Сanon, 37127Canon и т.п. из которых украсть файлы и нужно)
2) Создание Папки чтобы можно было указать имя в X:\- ПАКИ (очевидно что както через SendKeys повесить на F7, но к сожалению я пока ещё лох в таких делах) (если слишком геморно, то можно просто текущую дату) (я видел на форуме кусок кода где создаётся папка с датой через тотал,но увы не нашёл как переключить фокус на окошко F7 где задаётся название или же использовать эллемент Edit в скриптах)
3) Далее для меня вообще тёмный лес, но надо как то украсть все файлы из папки на флешке и залить в созданную папку и свернуть при этом Тотал Коммандер чтобы в фоновом режиме осталось окошко которое показывает процесс копирования. я даже не знаю, видимо копирование проще сделать через Скрипт, чем через команды Тотала, хоть и без окошка будет, ну да ладно.
4) По завершении закрыть Тотал

помогите ссылками, советами, кусками кодов :-)
*если такое уже было, то уж извинте, весь день лазил на сайте и
в базе знаний, видимо я просто слеп*
Аватара пользователя
kefirux
Сообщения: 20
Зарегистрирован: Вт дек 09, 2008 22:26
Контактная информация:

Сообщение kefirux »

пробывал написать начало на основе одного из кодов LocKtaR-o-DarK

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

w = WScript.CreateObject("WScript.Shell");
w.Run("E:\\Program Files\\Total Commander\\TOTALCMD.EXE /L=\"E:\\ -ПАКИ\" /R=\"F:\\Dcim\"",0);
if (w.AppActivate("TOTALCMD")){
WriteWord();
KL = false;}
function WriteWord() {
WScript.Sleep(30);
w.SendKeys("{F7}");
//тут поидее или вызов Скриптового Edit в который надо вводить имя
//(но я не знаю как это делается) или перевод фокуса в Тотал и //ожидание ввода
w.SendKeys("{Enter}");
w.SendKeys("{Enter}");}
но почемуто ругается на первый символ второй строчки "Не удаётся найти указанный файл"

а вот если переместить Дирректорию Тотал Коммандер в место где в пути не будет пробелов то прокатывает) но это имхо не логично.
но SendKeys F7 не работает всё равно
Аватара пользователя
Rodny
Сообщения: 949
Зарегистрирован: Ср янв 24, 2007 00:59
Откуда: Могилёв, Беларусь

Сообщение Rodny »

Аватара пользователя
kefirux
Сообщения: 20
Зарегистрирован: Вт дек 09, 2008 22:26
Контактная информация:

Сообщение kefirux »

у меня главная фишка юзать минимум дополнительных программ )
DIY своеобразный. в TCKB снова проверил. не нашёл. но если
вдруг замучаюсь то обращусь к сторонним программам. спасибо за ответ!
Аватара пользователя
kefirux
Сообщения: 20
Зарегистрирован: Вт дек 09, 2008 22:26
Контактная информация:

Сообщение kefirux »

продвижение
порылся ещё. нашёл прогу http://wincmd.ru/plugring/script_helper.html
без котороый дальнешее продвижение было бы не возможно.

отсюдова я уже могу создавать папку с именем которое мне нужно

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

Option Explicit
Dim TCS
Set TCS=CreateObject("TCSCRIPT.Helper")
TCS.Pause=100
TCS.Wait=true
TCS.SendCommand "cm_MkDir",TCS.Wait
TCS.SendKeystroke "{Enter}"
Set TCS = Nothing
WScript.Quit 
никто не подскажет как запустить через ВБСкрипт
Тотал Коммандер с ключами в коммандной строке?
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

Вот так, например:

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

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run """c:\Program Files\tc\totalcmd.exe"" " & "/L=""E:\- ПАКИ"" /R=""F:\Dcim"""
Set WshShell = Nothing
Главное, с кавычками не запутайся: внутренние нужно удваивать.
Аватара пользователя
kefirux
Сообщения: 20
Зарегистрирован: Вт дек 09, 2008 22:26
Контактная информация:

Сообщение kefirux »

Volniy писал(а):Вот так, например:

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

Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run """c:\Program Files\tc\totalcmd.exe"" " & "/L=""E:\- ПАКИ"" /R=""F:\Dcim"""
Set WshShell = Nothing
Главное, с кавычками не запутайся: внутренние нужно удваивать.
благодарю, я тут как раз бился головой об стол)
кстати для меня было неожиданностью что если свернуть ТК,
то команды функцией SendKeystroke передаются в Виндовс ))
из-за криво написанного скрипта у меня такой ад начался )

нынешнеяя версия моего продвижения:

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

Dim WshShell
Dim RetCode
Dim TCS
Dim Answer
Set WshShell = CreateObject("WScript.Shell")
RetCode = WshShell.Run("""E:\Program Files\Total Commander\TotALCMD.EXE"" /L=""X:\- ПАКИ ФОТОСЕТОВ"" /R=""F:/Dcim""", 0, False)
WScript.Sleep 1000
Set TCS=CreateObject("TCSCRIPT.Helper") 
TCS.Wait=true
TCS.SendCommand "cm_MkDir",TCS.Wait
TCS.SendKeystroke "{Enter}"


'тут покачто в планах кусок кода, где 
'0) скрипт проходит по всем папкам дирректории справа (без рекурсии)
'1) (начало цикла) комманда процессу /C /R="имя папки из ВБскрипта" 
'2) cm_SelectAll (выделяем всё)
'3) F5
'4) Enter (конец цикла)



TCS.SendCommand "cm_Minimize"
'TCS.SendCommand "cm_Exit"
Set TCS = Nothing
WScript.Quit 
Аватара пользователя
kefirux
Сообщения: 20
Зарегистрирован: Вт дек 09, 2008 22:26
Контактная информация:

Сообщение kefirux »

скажите честно, я делаю это через жопу? )
наверное есть другие приёмы
Аватара пользователя
kefirux
Сообщения: 20
Зарегистрирован: Вт дек 09, 2008 22:26
Контактная информация:

Сообщение kefirux »

ну вобщем-то я сделал это.
скрещивая пальцы каждый раз )

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

'Option Explicit
Dim WshShell
Dim RetCode
Dim fso
Dim StartFolder
Dim TCS
Dim FItem
Dim Answer
Dim curFolder
Set WshShell = CreateObject("WScript.Shell")
'параметр /O чтобы если вдруг он уже запущен, чтобы новую копию не загрузил.
RetCode = WshShell.Run("""E:\Program Files\Total Commander\TotALCMD.EXE"" /O /L=""X:\- ПАКИ ФОТОСЕТОВ"" /R=""F:/Dcim""", 0, False)
WScript.Sleep 1000
Set TCS=CreateObject("TCSCRIPT.Helper") 
TCS.Wait=true
TCS.SendCommand "cm_FocusLeft"
TCS.SendCommand "cm_MkDir",TCS.Wait
TCS.SendKeystroke "{Enter}"
TCS.SendCommand "cm_FocusRight"

Set fso = CreateObject("Scripting.FileSystemObject")

StartFolder = "F:/Dcim"
If fso.FolderExists(StartFolder) = False Then
MsgBox "какаято ошибка!", vbCritical
TCS.SendCommand "cm_Exit"
Set TCS = Nothing
WScript.Quit
End If
TCS.Pause=100

Set curFolder = fso.GetFolder(StartFolder)
For Each FItem In curFolder.SubFolders
' Проверка на условие для удаления
'msgbox Fitem & " Размер: " & Fitem.Size & " Байт" 
RetCode = WshShell.Run("""E:\Program Files\Total Commander\TotALCMD.EXE"" /O /R="""& Fitem &"""", 7, False)
WScript.Sleep 100
TCS.SendCommand "cm_SelectAll"
TCS.SendKeystroke "{F5}"
TCS.SendKeystroke "{Enter}"
Next


TCS.SendCommand "cm_Minimize"

Set TCS = Nothing
WScript.Quit 
Аватара пользователя
Вахмурка
Сообщения: 2587
Зарегистрирован: Пн дек 27, 2004 14:47
Откуда: Большая деревня Москва
Контактная информация:

Сообщение Вахмурка »

Даже если ты делаешь это через жопу и есть другие приемы, продолжай делать. Ни один программер не может сказать, что его первая (и даже сотая) программа была верхом совершенства. Не ошибается тот... (дальше все знают). Жаль, на Бейсике не пишу уже лет 10, а на VBS не писал никогда. Но твои дерзания заслуживают одобрения и поддержки.
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Аватара пользователя
kefirux
Сообщения: 20
Зарегистрирован: Вт дек 09, 2008 22:26
Контактная информация:

Сообщение kefirux »

Вахмурка писал(а):Даже если ты делаешь это через жопу и есть другие приемы, продолжай делать. Ни один программер не может сказать, что его первая (и даже сотая) программа была верхом совершенства. Не ошибается тот... (дальше все знают). Жаль, на Бейсике не пишу уже лет 10, а на VBS не писал никогда. Но твои дерзания заслуживают одобрения и поддержки.
спасибо)
я только вчера узнал что такое VBScript ))
а Visual Basic видел изделека.
но вот такие форумы рулят, вот авось за недельку и ВБСкрипту научусь
по примерам, а дальше уже МСДН в помощь
Аватара пользователя
kefirux
Сообщения: 20
Зарегистрирован: Вт дек 09, 2008 22:26
Контактная информация:

Сообщение kefirux »

товарищь Volniy, а вы не подскажите возможно ли узнать о завершении копировании файлов в ТС? есть больная идея циклом сравнивать размеры папок ) а то мне по завершении нужно загрузить ЛайтРум из целевой папки и завершить Тотал КОммандер

кстати если кому интересно, то в командной строке загружая LightRoom можно указать дирректорию, которую он сразу внесёт в библиотеку (на любителя конечно, но может кому пригодится)

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

RetCode = WshShell.Run("""E:\Program Files\Adobe\Adobe Photoshop Lightroom 2\lightroom.exe"" """ & TCS.GetTrgPath & """", 0, False)
Аватара пользователя
kefirux
Сообщения: 20
Зарегистрирован: Вт дек 09, 2008 22:26
Контактная информация:

Сообщение kefirux »

ну чтож. не прошло и года, а я всё-таки реализовал циклическое сравнение папок, и это кстати даже хорошо, потомучто по идее информация не должна теперь потеряться уж точно)

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

'Option Explicit
Dim WshShell
Dim RetCode
Dim fso
Dim StartFolder
Dim TCS
Dim FItem
Dim Answer
Dim curFolder, curFolder2
Set WshShell = CreateObject("WScript.Shell")
RetCode = WshShell.Run("""E:\Program Files\Total Commander\TotALCMD.EXE"" /O /L=""X:\- ПАКИ ФОТОСЕТОВ"" /R=""F:/Dcim""", 0, False)
WScript.Sleep 1000
Set TCS=CreateObject("TCSCRIPT.Helper") 
TCS.Wait=true
TCS.SendCommand "cm_FocusLeft"
TCS.SendCommand "cm_MkDir",TCS.Wait
TCS.SendKeystroke "{Enter}"
TCS.LockTC true
TCS.SendCommand "cm_FocusRight"

Set fso = CreateObject("Scripting.FileSystemObject")

StartFolder = "F:/Dcim"
If fso.FolderExists(StartFolder) = False Then
MsgBox "какаято ошибка!", vbCritical
TCS.SendCommand "cm_Exit"
Set TCS = Nothing
WScript.Quit
End If
TCS.Pause=200

Set curFolder = fso.GetFolder(StartFolder)
For Each FItem In curFolder.SubFolders
RetCode = WshShell.Run("""E:\Program Files\Total Commander\TotALCMD.EXE"" /O /R="""& Fitem &"""", 7, False)
WScript.Sleep 100
TCS.SendCommand "cm_SelectAll"
TCS.SendKeystroke "{F5}"
TCS.SendKeystroke "{Enter}"
Next

TCS.LockTC false
TCS.SendCommand "cm_Minimize"
Set curFolder2 = fso.GetFolder("F:/Dcim")

Do
     Set curFolder = fso.GetFolder(TCS.GetTrgPath)
     WScript.Sleep 500
Loop While curFolder.Size <> curFolder2.Size

answer = msgbox(TCS.GetTrgPath & " " & curFolder2.Size & " => " & curFolder.Size & vbNewLine & "=========================" & vbNewLine & "Запустить Lightroom?", vbOkCancel)
if answer=vbOk then RetCode = WshShell.Run("""E:\Program Files\Adobe\Adobe Photoshop Lightroom 2\lightroom.exe"" """ & TCS.GetTrgPath & """", 0, False)

TCS.SendCommand "cm_Exit"
Set TCS = Nothing
WScript.Quit 
хочу отметить что ВБ я до вчерашнего дня не знал)
долго искал как тут перенос строки сделать, оказывается vbNewLine
и самое смешное что вот если бы я сюда не писал бы о своих проблемах, то нифига бы не получилось, потому что великий закон подлости форумов - только спросил совета, как тут же находишь сам на него ответ)
Аватара пользователя
Volniy
Сообщения: 585
Зарегистрирован: Ср дек 15, 2004 00:17
Откуда: Местный

Сообщение Volniy »

Крученый, однако, скриптик вышел, мне не очень понятный, но раз работает, так пусть работает, "ничего только не меняй" (с) :D

Странно почему у тебя везде "F:/Dcim" с прямым слешем. Это ж, чай, не сетевой путь.

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

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

For Each FItem In curFolder.SubFolders
   fso.CopyFile FItem.Path & "\*.*", "F:\Dcim\"
Next
и все дела. Или я не прав :wink:
Аватара пользователя
kefirux
Сообщения: 20
Зарегистрирован: Вт дек 09, 2008 22:26
Контактная информация:

Сообщение kefirux »

Volniy писал(а):Крученый, однако, скриптик вышел, мне не очень понятный, но раз работает, так пусть работает, "ничего только не меняй" (с) :D

Странно почему у тебя везде "F:/Dcim" с прямым слешем. Это ж, чай, не сетевой путь.

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

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

For Each FItem In curFolder.SubFolders
   fso.CopyFile FItem.Path & "\*.*", "F:\Dcim"
Next
и все дела. Или я не прав :wink:
ну говорю же что в ВБ я лох)
да и вобще программирование часто у меня странное.
про прямой слеш только что заметил 0_0 действительно странно что работает. а Использован тотал только для корыстной цели: заюзать наглядность какие файлы в очереди, какая скорость передачи и сколько осталось копировать. просто втихую копировать вбскриптом както стрёмно, а чтобы написать свою версию этого окошка уйдёт много времени. да и вобще както доверяю Тоталу файлы свои )
Ответить