Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Копирование файла из одной папки в другую в определенные интервалы времени (bat)

Ответить
Настройки темы
CMD/BAT - Копирование файла из одной папки в другую в определенные интервалы времени (bat)

Новый участник


Сообщения: 2
Благодарности: 0

Профиль | Отправить PM | Цитировать


Изменения
Автор: pinguindell
Дата: 06-08-2019
Описание: корректировка названия темы
Добрый день уважаемые форумчане

Знаю, что такую задачу можно реализовать, с помощью bat файла, но не знаю как его написать, поэтому обращаюсь к Вам за помощью

Есть папки :

Откуда : T:\Откуда
Куда : C:\Users\UserName\Desktop\Куда


Необходимо чтобы bat файл, в 09 :00, в 12:00 и в 17:00, делал копию файла Презентация.pptx, который находится в папке Откуда и помещал его в папку Куда, при этом архивировал его в zip архив. Название архива должно состоять из названия копируемого файла, в нашем случае, это Презентация и даты и времени копирования.

Например Презентация_дата копирования_время копирования

Буду признателен за Вашу помощь

Отправлено: 15:48, 06-08-2019

 

Ветеран


Contributor


Сообщения: 1700
Благодарности: 1010

Профиль | Отправить PM | Цитировать


Iska,
Цитата Iska:
посмотрите на получившийся результат »
Посмотрел, если не дать поспать в cscript, в архив не пишется, wscript справляется, правда, последнее Echo нужно. Но тогда решение не годится для планировщика

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Последний раз редактировалось megaloman, 07-08-2019 в 19:17.


Отправлено: 19:08, 07-08-2019 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Contributor


Сообщения: 24590
Благодарности: 7153

Профиль | Отправить PM | Цитировать


Цитата megaloman:
если не дать поспать, в архив не пишется. »
Да, и в этом главная проблема: паузу-то любой длительности сделать можно, а вот как определить момент, когда данный асинхронный метод закончит исполняться?! Особенно, когда нам нужно добавить в архив не один-единственный файл, а целую кучу файлов и папок с разных исходных мест, к примеру. Есть, конечно, обходные пути, но всё это настолько ненадёжно и нестабильно…

Отправлено: 19:17, 07-08-2019 | #12


Ветеран


Contributor


Сообщения: 1700
Благодарности: 1010

Профиль | Отправить PM | Цитировать


Iska, В общем, корявство. Можно, конечно, сделать долгий слип, заведомо достаточный для конкретной задачи.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 19:21, 07-08-2019 | #13


Ветеран


Contributor


Сообщения: 24590
Благодарности: 7153

Профиль | Отправить PM | Цитировать


megaloman, да, конечно.

Отправлено: 19:26, 07-08-2019 | #14


Ветеран


Contributor


Сообщения: 1700
Благодарности: 1010

Профиль | Отправить PM | Цитировать


Iska, pinguindell, Для себя делаю резюме:
Вариант без стороннего архиватора
Этот вариант не годится для размещения в планировщике, так как обязательно надо отследить завершение архивации. Строка
MsgBox "После окончания процесса записи в архив нажмите ОК"
обязательна.

Код: Выделить весь код
FileIn = "Z:\Box_In\С Днем Рождения.ppt"

BoxArc = "Z:\Box_Arc"

With CreateObject("Scripting.FileSystemObject")
    If Not .FileExists(FileIn) Then
        WScript.Echo "!!! File " + FileIn + " not found"
        WScript.Quit 1
    End If

    If Not .FolderExists(BoxArc) Then
        WScript.Echo "!!! Folder " + BoxArc + " not found"
        WScript.Quit 1
    End If
    
    DT = CStr(Year(Date)) + Right("0" + CStr(Month(Date)), 2) + Right("0" + CStr(Day(Date)), 2)
    DT = DT + "-" + Right("0" + CStr(Hour(Time)), 2) + Right("0" + CStr(Minute(Time)), 2) + Right("0" + CStr(Second(Time)), 2)
    
    Zip = BoxArc + "\" + .GetBaseName(FileIn) + "_" + DT + ".zip"
    
    On Error Resume Next
    
    Err.Number = 0
    .CreateTextFile(Zip, True).Write "PK" + Chr(5) + Chr(6) + String(18, vbNullChar)

    If Err.Number <> 0 Then
        WScript.Echo "!!! " + Zip + "  " + Err.Description + "(" + CStr(Err.Number) + ")"
        WScript.Quit 1
    End If

    Err.Number = 0
    Set App = CreateObject("Shell.Application")
    Call App.Namespace(Zip).CopyHere(FileIn)

    If Err.Number <> 0 Then
        WScript.Echo "!!! " + Zip + "  " + Err.Description + "(" + CStr(Err.Number) + ")"
        WScript.Quit 1
    End If
End With
On Error GoTo 0
MsgBox "После окончания процесса записи в архив нажмите ОК" 

Как альтернатива, в предыдущем коде можно вставить заведомо бОльшее время ожидания чем требуется для завершения создания архива. Этот вариант можно поместить в планировщик. Раз архивирование делается с интервалом в часы, то и время ожидания можно поставить большое, например, 300 сек
MsgBox необходимо удалить
Код: Выделить весь код
    ..............
    ..............

    Call App.Namespace(Zip).CopyHere(FileIn)

    WScript.Sleep 300 * 1000

    If Err.Number <> 0 Then
        WScript.Echo "!!! " + Zip + "  " + Err.Description + "(" + CStr(Err.Number) + ")"
        WScript.Quit 1
    End If
End With
On Error GoTo 0
' MsgBox "После окончания процесса записи в архив нажмите ОК"
Можно, конечно, попробовать обойтись без Sleep Как вариант, посчитать количество файлов в архиве. Но это скользкий путь, так как при архивации большого файла он помещается в архив не сразу целиком, и преждевременное завершение скрипта приведёт к созданию увечного архива.

Вариант со сторонним архиватором, например, 7Z, запускаемым из-под vbs. Без проблем отработает в назначенных заданиях
Код: Выделить весь код
FileIn = "Z:\Box_In\С Днем Рождения.ppt"
BoxArc = "Z:\Box_Arc"

Arc = "C:\Program Files\7-Zip\7z.exe"

DT = CStr(Year(Date)) + Right("0" + CStr(Month(Date)), 2) + Right("0" + CStr(Day(Date)), 2)
DT = DT + "-" + Right("0" + CStr(Hour(Time)), 2) + Right("0" + CStr(Minute(Time)), 2) + Right("0" + CStr(Second(Time)), 2)
    
Zip = BoxArc + "\" + CreateObject("Scripting.FileSystemObject").GetBaseName(FileIn) + "_" + DT + ".zip"
    
Comm = """" + Arc + """ a """ + Zip + """ """ + FileIn + """ -mx5"
    
On Error Resume Next
    R = CreateObject("WScript.Shell").Run(Comm, 0, False)
    
    If Err.Number <> 0 Then
        WScript.Echo "Ошибка при вызове архиватора." + vbCrLf + vbCrLf + Comm + vbCrLf + vbCrLf + "Проверьте наличие файлов по указанным путям" + vbCrLf + Err.Description + "(" + CStr(Err.Number) + ")"
        WScript.Quit 1
    End If
On Error GoTo 0
Поубирал почти все проверки на существование файлов, так как всё равно при исполнении в назначенных заданиях аварийные сообщения никто не увидит. Кстати, а не сделать ли лог-файл этого процесса?

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.

Это сообщение посчитали полезным следующие участники:

Отправлено: 11:46, 08-08-2019 | #15


Ветеран


Contributor


Сообщения: 1700
Благодарности: 1010

Профиль | Отправить PM | Цитировать


pinguindell, можно вообще обойтись без файла со сценарием в назначенных заданиях.
Код: Выделить весь код
mshta vbscript:execute("fRAR="" """"Z:\Box_Arc\С Днем Рождения.ppt_.zip"""""" : fIn="" """"Z:\Box_In\С Днем Рождения.ppt"""""" : RAR=""""""C:\Program Files\WinRAR\Rar.exe"""" a -ep -dh -agYYYYMMDD-HHMMSS"" : R=CreateObject(""WScript.Shell"").Run(RAR+fRAR+fIn, 0, False) :close")
Но тут используется уже winrar c его возможностью добавлять к имени файла дату и время.

-------
Даже самая сложная проблема обязательно имеет простое, лёгкое для понимания, неправильное решение. Каждое решение плодит новые проблемы.


Отправлено: 15:09, 09-08-2019 | #16


Пользователь


Сообщения: 60
Благодарности: 10

Профиль | Отправить PM | Цитировать


*** let me Google that for you ***
Код: Выделить весь код
$source_path = 'c:\Users\Serguei\Music\Folder with a ton of Music'
$destination_path = 'c:\temp'
$zip_filename = 'result'
$zip_path = "${destination_path}\${zip_filename}.zip"

[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') | out-null
# create empty zip magic

set-content $zip_path ( [byte[]] @( 80, 75, 5, 6 + (, 0 * 18 ) ) ) -encoding byte

$source_folder = ( new-object -com 'Shell.Application' ).NameSpace( $source_path )

$zip_folder = ( new-object -com 'Shell.Application' ).NameSpace( $zip_path )

# запускаем на выполнение в диалог прогресс режиме, конца выполнения не ждём.
$zip_folder.CopyHere( $source_folder, 16 )

$check_count = (get-childitem -path $source_path ).count
$done = $false
# вот теперь ждем по большому

while ($done -eq $false){
  try{
    $check_zip = [IO.Compression.ZipFile]::OpenRead($zip_path)
    write-debug ('Counting items: {0}' -f ($check_zip.Entries).count )
    if( ($check_zip.Entries).count -eq $check_count){
      $check_zip.Dispose()
      $done = $true
      break
    }
  } catch [Exception] {
  }
  start-sleep -seconds 1
  write-host '.' -nonewline
}

Отправлено: 22:03, 11-08-2019 | #17



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Копирование файла из одной папки в другую в определенные интервалы времени (bat)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - копирование файлов из одной папки в другую cmd файлом через txt файл Marina_Egorova Скриптовые языки администрирования Windows 1 15-03-2018 22:36
Автоматическое копирование файлов из одной папки в другую. another_user Хочу все знать 4 25-09-2015 12:50
CMD/BAT - [решено] переместить указанное количество случайных файлов из одной папки в другую Alexander_88 Скриптовые языки администрирования Windows 2 25-08-2014 21:46
CMD/BAT - Копирование нескольких файлов из папки в другую с прошедшей датой salmans Скриптовые языки администрирования Windows 5 06-08-2013 03:01
CMD/BAT - [решено] смена размера копируемых файлов из одной папки в другую Вовка13 Скриптовые языки администрирования Windows 4 10-09-2011 22:07




 
Переход