Страница 1 из 2

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

Добавлено: Вт дек 09, 2008 22:49
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) По завершении закрыть Тотал

помогите ссылками, советами, кусками кодов :-)
*если такое уже было, то уж извинте, весь день лазил на сайте и
в базе знаний, видимо я просто слеп*

Добавлено: Вт дек 09, 2008 23:13
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 не работает всё равно

Добавлено: Ср дек 10, 2008 00:54
Rodny

Добавлено: Ср дек 10, 2008 01:16
kefirux
у меня главная фишка юзать минимум дополнительных программ )
DIY своеобразный. в TCKB снова проверил. не нашёл. но если
вдруг замучаюсь то обращусь к сторонним программам. спасибо за ответ!

Добавлено: Ср дек 10, 2008 01:19
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 
никто не подскажет как запустить через ВБСкрипт
Тотал Коммандер с ключами в коммандной строке?

Добавлено: Ср дек 10, 2008 09:33
Volniy
Вот так, например:

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

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

Добавлено: Ср дек 10, 2008 10:45
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 

Добавлено: Ср дек 10, 2008 10:46
kefirux
скажите честно, я делаю это через жопу? )
наверное есть другие приёмы

Добавлено: Ср дек 10, 2008 12:19
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 

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

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

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

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

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

RetCode = WshShell.Run("""E:\Program Files\Adobe\Adobe Photoshop Lightroom 2\lightroom.exe"" """ & TCS.GetTrgPath & """", 0, False)

Добавлено: Ср дек 10, 2008 16:09
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
и самое смешное что вот если бы я сюда не писал бы о своих проблемах, то нифига бы не получилось, потому что великий закон подлости форумов - только спросил совета, как тут же находишь сам на него ответ)

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

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

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

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

For Each FItem In curFolder.SubFolders
   fso.CopyFile FItem.Path & "\*.*", "F:\Dcim\"
Next
и все дела. Или я не прав :wink:

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

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

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

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

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