View previous topic :: View next topic |
Author |
Message |
kefirux

Joined: 09 Dec 2008 Posts: 20
|
(Separately) Posted: Tue Dec 09, 2008 23:49 Post subject: Автоматизированное копирование |
|
|
Здравствуйте, гуру автоматизации!
недавно маниакально решил заняться автоматизацией процессов на
своём компе. так вот появилась задача которую я пробывал батником решить:
вставляю Карту памяти в картридер
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) По завершении закрыть Тотал
помогите ссылками, советами, кусками кодов
*если такое уже было, то уж извинте, весь день лазил на сайте и
в базе знаний, видимо я просто слеп* |
|
Back to top |
|
 |
kefirux

Joined: 09 Dec 2008 Posts: 20
|
(Separately) Posted: Wed Dec 10, 2008 00:13 Post subject: |
|
|
пробывал написать начало на основе одного из кодов 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 |
|
 |
Rodny

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

Joined: 09 Dec 2008 Posts: 20
|
(Separately) Posted: Wed Dec 10, 2008 02:16 Post subject: |
|
|
у меня главная фишка юзать минимум дополнительных программ )
DIY своеобразный. в TCKB снова проверил. не нашёл. но если
вдруг замучаюсь то обращусь к сторонним программам. спасибо за ответ! |
|
Back to top |
|
 |
kefirux

Joined: 09 Dec 2008 Posts: 20
|
(Separately) Posted: Wed Dec 10, 2008 02:19 Post subject: |
|
|
продвижение
порылся ещё. нашёл прогу 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 |
|
 |
Volniy

Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Wed Dec 10, 2008 10:33 Post subject: |
|
|
Вот так, например:
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 |
|
 |
kefirux

Joined: 09 Dec 2008 Posts: 20
|
(Separately) Posted: Wed Dec 10, 2008 11:45 Post subject: |
|
|
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 |
|
 |
kefirux

Joined: 09 Dec 2008 Posts: 20
|
(Separately) Posted: Wed Dec 10, 2008 11:46 Post subject: |
|
|
скажите честно, я делаю это через жопу? )
наверное есть другие приёмы |
|
Back to top |
|
 |
kefirux

Joined: 09 Dec 2008 Posts: 20
|
(Separately) Posted: Wed Dec 10, 2008 13:19 Post subject: |
|
|
ну вобщем-то я сделал это.
скрещивая пальцы каждый раз )
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 |
|
 |
Вахмурка

Joined: 27 Dec 2004 Posts: 2586 Location: Большая деревня Москва
|
(Separately) Posted: Wed Dec 10, 2008 13:24 Post subject: |
|
|
Даже если ты делаешь это через жопу и есть другие приемы, продолжай делать. Ни один программер не может сказать, что его первая (и даже сотая) программа была верхом совершенства. Не ошибается тот... (дальше все знают). Жаль, на Бейсике не пишу уже лет 10, а на VBS не писал никогда. Но твои дерзания заслуживают одобрения и поддержки. _________________ Сайт PowerPro+Total Commander
Скрипты PowerPro для Total Commander
* * *
«Не усматривайте злого умысла в том, что вполне объяснимо глупостью» (Р. Хэнлон) |
|
Back to top |
|
 |
kefirux

Joined: 09 Dec 2008 Posts: 20
|
(Separately) Posted: Wed Dec 10, 2008 14:51 Post subject: |
|
|
Вахмурка wrote: | Даже если ты делаешь это через жопу и есть другие приемы, продолжай делать. Ни один программер не может сказать, что его первая (и даже сотая) программа была верхом совершенства. Не ошибается тот... (дальше все знают). Жаль, на Бейсике не пишу уже лет 10, а на VBS не писал никогда. Но твои дерзания заслуживают одобрения и поддержки. |
спасибо)
я только вчера узнал что такое VBScript ))
а Visual Basic видел изделека.
но вот такие форумы рулят, вот авось за недельку и ВБСкрипту научусь
по примерам, а дальше уже МСДН в помощь |
|
Back to top |
|
 |
kefirux

Joined: 09 Dec 2008 Posts: 20
|
(Separately) Posted: Wed Dec 10, 2008 14:56 Post subject: |
|
|
товарищь Volniy, а вы не подскажите возможно ли узнать о завершении копировании файлов в ТС? есть больная идея циклом сравнивать размеры папок ) а то мне по завершении нужно загрузить ЛайтРум из целевой папки и завершить Тотал КОммандер
кстати если кому интересно, то в командной строке загружая LightRoom можно указать дирректорию, которую он сразу внесёт в библиотеку (на любителя конечно, но может кому пригодится)
Code: |
RetCode = WshShell.Run("""E:\Program Files\Adobe\Adobe Photoshop Lightroom 2\lightroom.exe"" """ & TCS.GetTrgPath & """", 0, False)
|
|
|
Back to top |
|
 |
kefirux

Joined: 09 Dec 2008 Posts: 20
|
(Separately) Posted: Wed Dec 10, 2008 17:09 Post subject: |
|
|
ну чтож. не прошло и года, а я всё-таки реализовал циклическое сравнение папок, и это кстати даже хорошо, потомучто по идее информация не должна теперь потеряться уж точно)
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 |
|
 |
Volniy

Joined: 15 Dec 2004 Posts: 585 Location: Местный
|
(Separately) Posted: Thu Dec 11, 2008 00:06 Post subject: |
|
|
Крученый, однако, скриптик вышел, мне не очень понятный, но раз работает, так пусть работает, "ничего только не меняй" (с)
Странно почему у тебя везде "F:/Dcim" с прямым слешем. Это ж, чай, не сетевой путь.
А вообще-то я бы посоветовал копирование Тоталом не осуществлять. Зачем оно тут вааще, ведь его расширенные фичи не задействованы никак, просто копируются все файлы из каждой папки, так? Все, для чего тут нужен Тотал, это получение от него списка папок, содержимое которых нужно копировать и все. Ну, а далее:
Code: | For Each FItem In curFolder.SubFolders
fso.CopyFile FItem.Path & "\*.*", "F:\Dcim\"
Next |
и все дела. Или я не прав  |
|
Back to top |
|
 |
kefirux

Joined: 09 Dec 2008 Posts: 20
|
(Separately) Posted: Thu Dec 11, 2008 00:12 Post subject: |
|
|
Volniy wrote: | Крученый, однако, скриптик вышел, мне не очень понятный, но раз работает, так пусть работает, "ничего только не меняй" (с)
Странно почему у тебя везде "F:/Dcim" с прямым слешем. Это ж, чай, не сетевой путь.
А вообще-то я бы посоветовал копирование Тоталом не осуществлять. Зачем оно тут вааще, ведь его расширенные фичи не задействованы никак, просто копируются все файлы из каждой папки, так? Все, для чего тут нужен Тотал, это получение от него списка папок, содержимое которых нужно копировать и все. Ну, а далее:
Code: | For Each FItem In curFolder.SubFolders
fso.CopyFile FItem.Path & "\*.*", "F:\Dcim\"
Next |
и все дела. Или я не прав  |
ну говорю же что в ВБ я лох)
да и вобще программирование часто у меня странное.
про прямой слеш только что заметил 0_0 действительно странно что работает. а Использован тотал только для корыстной цели: заюзать наглядность какие файлы в очереди, какая скорость передачи и сколько осталось копировать. просто втихую копировать вбскриптом както стрёмно, а чтобы написать свою версию этого окошка уйдёт много времени. да и вобще както доверяю Тоталу файлы свои ) |
|
Back to top |
|
 |
|
|
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
|