Что нового

Одновременное копирование множества файлов и папок

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Александр [?]
а разве нельзя запустить несколько скриптов на копирование папок?
можно. но
1. это не так изящно, как если в одном скрипте
2. необходимо чтобы каждый скрипт знал куда копировать. например передачей командной строки, либо брать данные из файла, либо посредством еще одного - головного - скрипта, который будет запускать рабочие. вобщем, смотри п.1
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
то, что предолжено http://autoit-script.ru/index.php/topic,9142.msg61288.html#msg61288
и есть поочередное копирование . ведь функции xcopy передаются одиночные параметры: один путь назначения.
поэтому все равно скрипт строится так
http://autoit-script.ru/index.php/topic,9142.msg61296.html#msg61296 то есть поочередное копирует папки
так почему же не завертеть обычную автоитовскую команду копирования папок в цикле? ведь все работает

возможно я чего то недопонимаю, тоже хочется знать.. да и автору темы полезно будет..( наверное )
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Александр [?]
то, что предолжено Re: Одновременное копирование множества файлов и папок
и есть поочередное копирование . ведь функции xcopy передаются одиночные параметры: один путь назначения.
Но функция возвращает сразу (Run а не RunWait), и запускается ещё одна копия xcopy, уже с другими параметрами (копирование другого каталога).
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
то есть в итоге поочередно запускаются несколько копий xcopy. ну в принципе это то же поочередное копирование. по сути то так?
а если так. то все равно функция должна быть в цикле, запуская очередную копию xcopy и передавая ей новый адрес назначения.
извините за настырность...пишу не ради спора..самому ведь может пригодиться.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Александр
разница будет ощутима если копируются объемные файлы. DirCopy будет ждать завершения копирования, а xcopy можно запускать один за другим не дожидаясь ничего
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Александр [?]
то есть в итоге поочередно запускаются несколько копий xcopy. ну в принципе это то же поочередное копирование
Поочерёдно запускаться, но выполняться будут одновременно.

все равно функция должна быть в цикле
Не должна, цикл тут не при чём.
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
Я просто это скомпилировал у меня почему то не работал он
Код:
_DirCopy('C:\Src', 'D:\Dst')

Func _DirCopy($sSrc, $sDest, $iReplace = 0)
    Local $sReplace = ' /Y'

    If Not $iReplace Then
        $sReplace = ''
    EndIf

    Run('xcopy /H /E /C /I /S' & $sReplace & ' "' & $sSrc & '" "' & $sDest & '"', '', @SW_HIDE)
EndFunc

можешь полностью написать скрипт по тем параметрам которые я тебе дал
Код:
DirCopy("\\10.2.1.3\soft\zip", "\\10.2.1.1\c$\1", 1)
DirCopy("\\10.2.1.3\soft\zip", "\\10.2.1.2\c$\1", 1)
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
вот примерная альтернатива xcopy
все работает одновременно ( почти :smile: )
Код:
Dim $array[4]
$array[0] = '\\10.2.1.1\c$\'
$array[1] = '\\10.2.1.2\c$\'
$array[2] = '\\10.2.1.3\c$\'
$array[3] = '\\10.2.1.4\c$\'
Dim $massiv[4]
$massiv[0] = '1.tmp'
$massiv[1]='2.tmp'
$massiv[2]='3.tmp'
$massiv[3]='4.tmp'
For $i =0 To UBound($Array)-1
	For $i=0 To UBound($massiv)-1
	$write = FileOpen( $massiv[$i],2)
	FileWrite($write,'dirCopy("\\10.2.1.3\soft\zip",' & '"' & $array[$i] &"1"& '"' &",1)")
	FileClose($write)
	Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & $massiv[$i])
	Next
	Next

так как пути известны, то один раз забиваем в скрипт и добавляем имена временных файлов. указываем расположение временных файлов в
Код:
@TempDir

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

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Александр
мне не понятен твой порыв :smile: никто ведь не утверждал что нельзя, или что это трудно-реализуемо, и тому подобное. более того, один из вариантов твоего скрипты даже был озвучен выше
Kaster [?]
посредством еще одного - головного - скрипта, который будет запускать рабочие
и еще,
Александр [?]
примерная альтернатива xcopy
посмотри возможности xcopy Xcopy ;D
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
при данной задаче (пост 1) упоминалось только копирование.
был приведен пример с использованием xcopy. параметры этой команды можно видеть и в cmd.
я привел альтернативный пример.
насчет порыва :smile:
просто стало интересно реализовать само копирование инструментами автоит.
копирование по сети, использование атрибутов файлов - делается без xcopy.
прошу не понимать мои слова превратно...просто я увлекающаяся натура ;D
для меня лично эта тема была полезна. и спасибо за разъяснения.
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
Код:
Dim $array[4]
$array[0] = '\\10.2.1.1\c$\'
$array[1] = '\\10.2.1.2\c$\'
$array[2] = '\\10.2.1.3\c$\'
$array[3] = '\\10.2.1.4\c$\'
Dim $massiv[4]
$massiv[0] = '1.tmp'
$massiv[1]='2.tmp'
$massiv[2]='3.tmp'
$massiv[3]='4.tmp'
For $i =0 To UBound($Array)-1
    For $i=0 To UBound($massiv)-1
    $write = FileOpen( $massiv[$i],2)
    FileWrite($write,'dirCopy("\\10.2.1.3\soft\zip",' & '"' & $array[$i] &"1"& '"' &",1)")
    FileClose($write)
    Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & $massiv[$i])
    Next
    Next

А как мне сделать Log файл чтоб допустим если компьютер включен, то создается лог файл типа файлы скопированы успешно. А допустим некоторые компьютеры выключены, чтоб тоже создавался лог файл типа не удалось скопировать файлы. такое возможно сделать ваще кто нить в курсе???
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
Автор: Yashied
Копируем файлы без "тормозов", пример 2...
Я уже скрипт копирования написал мне нужно чтоб щас Log файл приходил, что успешно скопировалось и, что не успешно


Добавлено:
Сообщение автоматически объединено:

И еще мне нужно, чтоб скрипт в начале завершал процесс Launcher.exe на всех машинах, если такой есть процесс, тока потом начинал копировать папку???? Как реализовать это??? И Еще я писал выша надо, что выводил лог файл о том, что скопировалось удачно или нет по все машинам??? Помогите плиз.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
Timerlan [?]
завершал процесс Launcher.exe,
ну так поставь вначале
Код:
ProcessClose

а потом
Код:
ProcessExists


то выводил лог файл о том, что скопировалось удачно или нет по все машинам???
используй
Код:
FileExists('\\путь\папка')

далее записываешь результат в лог..
я так понял ты используешь мой вариант одновременного копирования..
вот измененная версия
Код:
#include <file.au3>
$open = FileSelectFolder('','')
Dim $szDrive, $szDir, $szFName, $szExt
$TestPath = _PathSplit($open, $szDrive, $szDir, $szFName, $szExt)
Dim $array[4]
$array[0] = 'C:\Users\user\Desktop\1\'
$array[1] = 'F:\3\'
$array[2] = 'E:\2\'
$array[3] = 'C:\Users\user\4\'
For $i =0 To UBound($Array)-1
    $name = StringRegExpReplace($array[$i],'[\:\\]','')
    $write = FileOpen(@TempDir & '\' & $name & '.tmp' ,2)
    FileWrite($write,'DirCopy('& "'"& $open & "'"& ',' & "'" & $array[$i] &  $TestPath[3] & "'" &",1)")
    FileClose($write)
    Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & @TempDir & '\' & $name & '.tmp')
Next
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
Код:
#include <file.au3>
$open = FileSelectFolder('','')
Dim $szDrive, $szDir, $szFName, $szExt
$TestPath = _PathSplit($open, $szDrive, $szDir, $szFName, $szExt)
Dim $array[4]
$array[0] = 'C:\Users\user\Desktop\1\'
$array[1] = 'F:\3\'
$array[2] = 'E:\2\'
$array[3] = 'C:\Users\user\4\'
For $i =0 To UBound($Array)-1
    $name = StringRegExpReplace($array[$i],'[\:\\]','')
    MsgBox(0,'',$name)
    $write = FileOpen(@TempDir & '\' & $name & '.tmp' ,2)
    FileWrite($write,'DirCopy('& "'"& $open & "'"& ',' & "'" & $array[$i] &  $TestPath[3] & "'" &",1)")
    FileClose($write)
    Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & @TempDir & '\' & $name & '.tmp')
Next


Да я использую твой скрипт. А че тут изменено? А можешь полностью написать скрипт по тем требованиям которые я хочу?


Добавлено:
Сообщение автоматически объединено:

Чет я ваще пока не могу разобраться в твоем новом скрипте((


Добавлено:
Сообщение автоматически объединено:

Первый скрипт твой лучше я хоть в нем разобрался. а тут ваще непонятно ни че :'( Тока мне там в первом скрипте не нравится, то что он создает временные файлы может быть их как нить можно опустить чтоб он не создавал их
Код:
Dim $massiv[4]
$massiv[0] = '1.tmp'
$massiv[1]='2.tmp'
$massiv[2]='3.tmp'
$massiv[3]='4.tmp'
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
Timerlan [?]
то что он создает временные файлы может быть их как нить можно опустить чтоб он не создавал их
никак...ведь именно эти файлы запускаются основным скриптом и в них команды для копирования..происходит почти одновременное копирование.
если смущает , то пользуйся примером с xcopy...
во втором варианте временные файлы создаются в системной папке temp..они не мешают
Код:
$open = FileSelectFolder('','')
это выбор папки , которую нужно копировать на другие компы..если известна папка, то можно задать просто путь
типа
Код:
$open = 'C:\папка'

это убери..сообщение я вставил для проверки срабатывания
Код:
MsgBox(0,'',$name)

если пользуешься первым вариантом, то укажи папку temp
Код:
$massiv[0] = @TempDir & '\1.tmp'

ну и далее по образцу.
но второй лучше тем, что не нужно прописывать пути к временным файлам..они прописаны один раз и получают названия автоматически по имени пути..проверял не раз - все работает отлично (ХР и вынь 7)
вобщем , если путей много, то не нужно для каждого прописывать свой временный файл копирования..это уменьшает скрипт по строкам..ну и тебе работу ;)
выложи свой скрипт полностью можно будет посмотреть куда что вставить...но твои желания об отчетах и проверке путей не сложны. правда , может не совсем по теме будет..ведь один вопрос - одна тема.
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
Ну вот старый скрипт выкладываю как я сделал вроде нормально работает, если можешь переделый его на новый

Код:
$sPath = '\\10.2.1.1\c$\Update'  ; это я так реализовал чтоб он сперва удалял папку Update и все что там есть
DirRemove($sPath, 1)
$sPath = '\\10.2.1.2\c$\Update'
DirRemove($sPath, 1)
$sPath = '\\10.2.1.3\c$\Update'
DirRemove($sPath, 1)
$sPath = '\\10.2.1.4\c$\Update'
DirRemove($sPath, 1)
Dim $array[4]
$array[0] = '\\10.2.1.1\c$\'
$array[1] = '\\10.2.1.2\c$\'
$array[2] = '\\10.2.1.3\c$\'
$array[3] = '\\10.2.1.4\c$\'
Dim $massiv[4]
$massiv[0] = 'c:\1\1.tmp'
$massiv[1]='c:\1\2.tmp'
$massiv[2]='c:\1\3.tmp'
$massiv[3]='c:\1\4.tmp'
For $i =0 To UBound($Array)-1
    For $i=0 To UBound($massiv)-1
    $write = FileOpen( $massiv[$i],2)
	FileWrite($write,'dirCopy("\\10.2.10.10\Soft&Drivers\Программы\Архиваторы\7-Zip",' & '"' & $array[$i] &"Update"& '"' &",1)")
	FileClose($write)
    Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & $massiv[$i])
    Next
    Next


И еще все таки можешь помочь чтоб скрипт в начале завершал процесс Launcher.exe на всех машинах, если такой есть процесс, тока потом начинал копировать папку???? Как реализовать это??? И Еще надо, что выводил лог файл о том, что скопировалось удачно или если допустим ПК был выключен чтоб приходил log что не успешно по все машинам??? Помогите плиз.
 

joiner

Модератор
Локальный модератор
Сообщения
3,557
Репутация
628
исходя из предложенного. так
Код:
#include <file.au3>
$open ='путь к папке, которую будем копировать';пример - C:\test
Dim $szDrive, $szDir, $szFName, $szExt
$TestPath = _PathSplit($open, $szDrive, $szDir, $szFName, $szExt)

Dim $array[4]

$array[0] = '\\10.2.1.1\c$\Update'
$array[1] = '\\10.2.1.2\c$\Update'
$array[2] = '\\10.2.1.3\c$\Update'
$array[3] = '\\10.2.1.4\c$\Update'
;удаление папки
For $i =0 To UBound($Array)-1
	$name = StringRegExpReplace($array[$i],'[\:\\]','')
    $write = FileOpen(@TempDir & '\' & $name & '.tmp' ,2)
    FileWrite($write,'DirRemove('& "'" & $array[$i] & "'" & ',1)')
    FileClose($write)
    Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & @TempDir & '\' & $name & '.tmp')
	Next
;копирование папки
For $i =0 To UBound($Array)-1
    $name = StringRegExpReplace($array[$i],'[\:\\]','')
    $write = FileOpen(@TempDir & '\' & $name & '.tmp' ,2)
    FileWrite($write,'DirCopy('& "'"& $open & "'"& ',' & "'" & $array[$i] & "\" & $TestPath[3] & "'" &",1)")
    FileClose($write)
    Run(@AutoItExe & ' /AutoIt3ExecuteScript ' & @TempDir & '\' & $name & '.tmp')
Next
 
Автор
T

Timerlan

Новичок
Сообщения
93
Репутация
0
Завтра про тестю на работе большое спасибо!

Вот еще бы с этим помог ваще было бы замечательно, чтоб скрипт в начале завершал процесс Launcher.exe на всех машинах, если такой есть процесс, тока потом начинал копировать папку???? Как реализовать это??? И Еще надо, что выводил лог файл о том, что скопировалось удачно или если допустим ПК был выключен чтоб приходил log что не успешно по все машинам???
 
Верх