Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Автоматизированное копирование
Goto page 1, 2  Next
 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
kefirux



Joined: 09 Dec 2008
Posts: 20

Post (Separately) Posted: Tue Dec 09, 2008 23:49    Post subject: Автоматизированное копирование Reply with quote

Здравствуйте, гуру автоматизации!
недавно маниакально решил заняться автоматизацией процессов на
своём компе. так вот появилась задача которую я пробывал батником решить:
вставляю Карту памяти в картридер
1) создать на харддиске папку с текущей датой (в идеале конечно нужен запрос на имя папки, но ниасилил я такую фигню провернуть)
2) потом заходим на карту памяти и надо скопировать из всех папок файлы в ту папку которую я только что создал (не сами папки, а файлы из них)
в батнике это у меня получилось вот так:
Code:
cd /d "X:\- ПАКИ"
md %date%
cd %date%
for /D %f in (F:\Dcim\*.*) do cd %f && xcopy %f\*.* . /s /e /r && cd ..


но проблемы появились:

Code:

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) По завершении закрыть Тотал

помогите ссылками, советами, кусками кодов Smile
*если такое уже было, то уж извинте, весь день лазил на сайте и
в базе знаний, видимо я просто слеп*
Back to top
View user's profile Send private message
kefirux



Joined: 09 Dec 2008
Posts: 20

Post (Separately) Posted: Wed Dec 10, 2008 00:13    Post subject: Reply with quote

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

Code:

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 не работает всё равно
Back to top
View user's profile Send private message
Rodny



Joined: 24 Jan 2007
Posts: 949
Location: Могилёв, Беларусь

Post (Separately) Posted: Wed Dec 10, 2008 01:54    Post subject: Reply with quote

kefirux
копирование фоток с автоматическим переименованием вставляя
Back to top
View user's profile Send private message
kefirux



Joined: 09 Dec 2008
Posts: 20

Post (Separately) Posted: Wed Dec 10, 2008 02:16    Post subject: Reply with quote

Rodny wrote:
kefirux
копирование фоток с автоматическим переименованием вставляя

у меня главная фишка юзать минимум дополнительных программ )
DIY своеобразный. в TCKB снова проверил. не нашёл. но если
вдруг замучаюсь то обращусь к сторонним программам. спасибо за ответ!
Back to top
View user's profile Send private message
kefirux



Joined: 09 Dec 2008
Posts: 20

Post (Separately) Posted: Wed Dec 10, 2008 02:19    Post subject: Reply with quote

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

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

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


никто не подскажет как запустить через ВБСкрипт
Тотал Коммандер с ключами в коммандной строке?
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Wed Dec 10, 2008 10:33    Post subject: Reply with quote

Вот так, например:
Code:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run """c:\Program Files\tc\totalcmd.exe"" " & "/L=""E:\- ПАКИ"" /R=""F:\Dcim"""
Set WshShell = Nothing

Главное, с кавычками не запутайся: внутренние нужно удваивать.
Back to top
View user's profile Send private message
kefirux



Joined: 09 Dec 2008
Posts: 20

Post (Separately) Posted: Wed Dec 10, 2008 11:45    Post subject: Reply with quote

Volniy wrote:
Вот так, например:
Code:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run """c:\Program Files\tc\totalcmd.exe"" " & "/L=""E:\- ПАКИ"" /R=""F:\Dcim"""
Set WshShell = Nothing

Главное, с кавычками не запутайся: внутренние нужно удваивать.

благодарю, я тут как раз бился головой об стол)
кстати для меня было неожиданностью что если свернуть ТК,
то команды функцией SendKeystroke передаются в Виндовс ))
из-за криво написанного скрипта у меня такой ад начался )

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

Code:

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
Back to top
View user's profile Send private message
kefirux



Joined: 09 Dec 2008
Posts: 20

Post (Separately) Posted: Wed Dec 10, 2008 11:46    Post subject: Reply with quote

скажите честно, я делаю это через жопу? )
наверное есть другие приёмы
Back to top
View user's profile Send private message
kefirux



Joined: 09 Dec 2008
Posts: 20

Post (Separately) Posted: Wed Dec 10, 2008 13:19    Post subject: Reply with quote

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

'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
Back to top
View user's profile Send private message
Вахмурка



Joined: 27 Dec 2004
Posts: 2586
Location: Большая деревня Москва

Post (Separately) Posted: Wed Dec 10, 2008 13:24    Post subject: Reply with quote

Даже если ты делаешь это через жопу и есть другие приемы, продолжай делать. Ни один программер не может сказать, что его первая (и даже сотая) программа была верхом совершенства. Не ошибается тот... (дальше все знают). Жаль, на Бейсике не пишу уже лет 10, а на VBS не писал никогда. Но твои дерзания заслуживают одобрения и поддержки.
_________________
Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон)
Back to top
View user's profile Send private message
kefirux



Joined: 09 Dec 2008
Posts: 20

Post (Separately) Posted: Wed Dec 10, 2008 14:51    Post subject: Reply with quote

Вахмурка wrote:
Даже если ты делаешь это через жопу и есть другие приемы, продолжай делать. Ни один программер не может сказать, что его первая (и даже сотая) программа была верхом совершенства. Не ошибается тот... (дальше все знают). Жаль, на Бейсике не пишу уже лет 10, а на VBS не писал никогда. Но твои дерзания заслуживают одобрения и поддержки.

спасибо)
я только вчера узнал что такое VBScript ))
а Visual Basic видел изделека.
но вот такие форумы рулят, вот авось за недельку и ВБСкрипту научусь
по примерам, а дальше уже МСДН в помощь
Back to top
View user's profile Send private message
kefirux



Joined: 09 Dec 2008
Posts: 20

Post (Separately) Posted: Wed Dec 10, 2008 14:56    Post subject: Reply with quote

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

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

Code:

RetCode = WshShell.Run("""E:\Program Files\Adobe\Adobe Photoshop Lightroom 2\lightroom.exe"" """ & TCS.GetTrgPath & """", 0, False)
Back to top
View user's profile Send private message
kefirux



Joined: 09 Dec 2008
Posts: 20

Post (Separately) Posted: Wed Dec 10, 2008 17:09    Post subject: Reply with quote

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

Code:

'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
и самое смешное что вот если бы я сюда не писал бы о своих проблемах, то нифига бы не получилось, потому что великий закон подлости форумов - только спросил совета, как тут же находишь сам на него ответ)
Back to top
View user's profile Send private message
Volniy



Joined: 15 Dec 2004
Posts: 585
Location: Местный

Post (Separately) Posted: Thu Dec 11, 2008 00:06    Post subject: Reply with quote

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

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

А вообще-то я бы посоветовал копирование Тоталом не осуществлять. Зачем оно тут вааще, ведь его расширенные фичи не задействованы никак, просто копируются все файлы из каждой папки, так? Все, для чего тут нужен Тотал, это получение от него списка папок, содержимое которых нужно копировать и все. Ну, а далее:
Code:
For Each FItem In curFolder.SubFolders
   fso.CopyFile FItem.Path & "\*.*", "F:\Dcim\"
Next

и все дела. Или я не прав Wink
Back to top
View user's profile Send private message
kefirux



Joined: 09 Dec 2008
Posts: 20

Post (Separately) Posted: Thu Dec 11, 2008 00:12    Post subject: Reply with quote

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

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

А вообще-то я бы посоветовал копирование Тоталом не осуществлять. Зачем оно тут вааще, ведь его расширенные фичи не задействованы никак, просто копируются все файлы из каждой папки, так? Все, для чего тут нужен Тотал, это получение от него списка папок, содержимое которых нужно копировать и все. Ну, а далее:
Code:
For Each FItem In curFolder.SubFolders
   fso.CopyFile FItem.Path & "\*.*", "F:\Dcim\"
Next

и все дела. Или я не прав Wink


ну говорю же что в ВБ я лох)
да и вобще программирование часто у меня странное.
про прямой слеш только что заметил 0_0 действительно странно что работает. а Использован тотал только для корыстной цели: заюзать наглядность какие файлы в очереди, какая скорость передачи и сколько осталось копировать. просто втихую копировать вбскриптом както стрёмно, а чтобы написать свою версию этого окошка уйдёт много времени. да и вобще както доверяю Тоталу файлы свои )
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group