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

Компьютерный форум 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

 

Ветеран


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

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


pinguindell, в пакетных файлах нет встроенных средств для создания архивов. Посему лучшим вариантом из встроенных средств будет использование PowerShell, наподобие:
Код: Выделить весь код
Add-Type -AssemblyName 'System.IO.Compression.FileSystem'

$sFileName     = 'Презентация.pptx'

$sSourceFolder = 'T:\Откуда'
$sDestFolder   = [System.IO.Path]::Combine([System.Environment]::GetFolderPath('Desktop'), 'Куда')


$sSourceFileName = [System.IO.Path]::Combine($sSourceFolder, $sFileName)
$sDestFileName   = [System.IO.Path]::Combine($sDestFolder, [System.IO.Path]::GetFileNameWithoutExtension($sFileName) + (Get-Date -f '_yyyyMMdd_HHmmss') + '.zip')

if([System.IO.File]::Exists($sSourceFileName)) {
    if([System.IO.Directory]::Exists($sDestFolder)) {
        Compress-Archive -Path $sSourceFileName -DestinationPath $sDestFileName -Force

        if([System.IO.File]::Exists($sDestFileName)) {
            Write-Host "Successfully create zip-archive [$sDestFileName]." -ForegroundColor Green
        } else {
            Write-Host "Can't create zip-archive [$sDestFileName]." -ForegroundColor Red
        }
    } else {
        Write-Host "Can't find destination folder [$sDestFolder]." -ForegroundColor Red
    }
} else {
    Write-Host "Can't find source file [$sSourceFileName]." -ForegroundColor Red
}
Цитата pinguindell:
в 09 :00, в 12:00 и в 17:00, »
Создаёте задание в Планировщике, которое будет исполнять скрипт PowerShell с данным кодом в указанное время.
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:56, 06-08-2019 | #2



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

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


Ветеран


Contributor


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

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


pinguindell, Посредством бесплатного архиватора 7Z (имя файла и путь укажите свои,
при наличии в именах файла/папок кириллицы озаботьтесь сохранить скрипт в 866 кодировке)
Код: Выделить весь код
@Echo Off
        Set "FileIn=Z:\Box_In\Вязкость.png"
	Set "BoxArc=Z:\Box_Arc"
	
	Call :Arc "%FileIn%" "%BoxArc%"
Exit /B

:Arc
	If Not Exist %1 (Echo File %1 not found &Exit /B 2)
	If Not Exist "%~2\" (Echo Folder %2 not found &Exit /B 2)

	FOR /F "tokens=2 delims==." %%d in ('WMIC OS GET LOCALDATETIME /VALUE') DO (
		"C:\Program Files\7-Zip\7z.exe" a "%~2\%~n1_%%d.zip" %1 -mx5
	)
Exit /B
Цитата Iska:
Создаёте задание в Планировщике, которое будет исполнять скрипт с данным кодом в указанное время. »

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


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

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

Отправлено: 17:16, 06-08-2019 | #3


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


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

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


Iska, спасибо большое !

и еще небольшое дополнение, для запуска power shell скрипта через планировщик, без отображения окна PowerShell, написал скрипт vbs, который запускает все это великолепие в фоновом режиме, без показа окна консоли

Код: Выделить весь код
command = "powershell.exe -nologo -noninteractive -command C:\Users\user_name\Desktop\ps_script.ps1"
set shell = CreateObject("WScript.Shell")
shell.Run command,0, false
плюс в самой задаче в планировщике, во вкладке Общие, установить галку внизу "Скрытая задача"

megaloman , также спасибо большое, буду изучать и Ваш вариант

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


Ветеран


Contributor


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

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


Цитата pinguindell:
написал скрипт vbs, который запускает все это великолепие в фоновом режиме, без показа окна консоли »
Ну, раз такая пьянка, то лучше уж всё сделать в VBS. Нагуглил, доработал.
Код: Выделить весь код
FileIn = "Z:\Box_In\Вязкость.png"
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

    Set App = CreateObject("Shell.Application")

    Err.Number = 0
    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
WScript.Echo "=== " + Zip + "  Done"
Оказывается, нечто подобное было на форуме. При большом объеме будет окно ожидания.

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


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

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

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


Ветеран


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

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


Цитата megaloman:
Код: Выделить весь код
App.Namespace(Zip).CopyHere (FileIn)
»
Полагаю, эти скобки — лишние.
Это сообщение посчитали полезным следующие участники:

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


Ветеран


Contributor


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

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


Iska, Скобки там не существенны, хотя лишнее - всегда во вред. Хуже, что скрипт работает корректно только при запуске посредством Wscript, с Cscript писАть в архив не хочет.

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


Отправлено: 16:43, 07-08-2019 | #7


Ветеран


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

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


Цитата megaloman:
Iska, Скобки там не существенны, »
megaloman, согласен.

Собственно, всю разницу можно увидеть на таком примере:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strValue


strValue = "AAAA"
SomeSub strValue
WScript.Echo "strValue = " & strValue

WScript.Echo

strValue = "AAAA"
SomeSub (strValue)
WScript.Echo "strValue = " & strValue

WScript.Quit 0

Sub SomeSub(anyValue)
	WScript.Echo "anyValue before = " & anyValue
	anyValue = anyValue & "+" & anyValue
	WScript.Echo "anyValue after  = " & anyValue
End Sub
Цитата:
Код: Выделить весь код
anyValue before = AAAA
anyValue after  = AAAA+AAAA
strValue = AAAA+AAAA

anyValue before = AAAA
anyValue after  = AAAA+AAAA
strValue = AAAA

По умолчанию, в VBScript параметры передаются по ссылке (в стек кладётся не значение переменной-параметра, а ссылка на саму переменную-параметр), посему, если изменить значение аргумента внутри процедуры/функции — это отразится на значении самого переданного параметра (поскольку на самом деле работа идёт как раз с ним).

Когда аргумент заключается в скобки — тем самым сначала вычисляется выражение в скобках, а затем уже это вычисленное значение передаётся в процедуру/функцию.

В таких языках, как, например, AutoIt — там практически любой вызов оформляется скобками, а вот в VBScript — скобки используются только тогда, когда вызов осуществляется в правой части выражения. В противном случае скобки интерпретируются не как скобки при вызове процедуры/функции, а как необходимость вычисления выражения.

Когда у нас имеется несколько параметров — ничего страшного, попытка такого вызова:
Код: Выделить весь код
SomeSub (strValue1, strValue2)
приведёт к тому, что возникнет ошибка компиляции «Недопустимо использование скобок при вызове процедуры Sub». А вот если аргумент будет один, как в случае выше:
Код: Выделить весь код
SomeSub (strValue)
— компилятор просто решит, что «ничего страшного, (strValue) — это просто выражение, которое надо вычислить и затем передать его значение в процедуру/функцию».

Цитата megaloman:
Хуже, что скрипт работает корректно только при запуске посредством Wscript, с Cscript писАть в архив не хочет. »
И хочет, и пишет. Просто не успевает, поскольку метод .CopyHere() работает асинхронно, т.е., объект Folder класса Shell.Application не ждёт окончания работы метода, а сразу возвращает управление скрипту, который, соответственно, продолжает свою работу. Боюсь, что на достаточно крупных файлах «обломится» и wscript.exe (сейчас не проверялось, я уже не помню конкретики).
Это сообщение посчитали полезным следующие участники:

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


Ветеран


Contributor


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

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


Iska, wscript.exe 1,4G съедает без проблем, сscript.exe и с 3 байтами не справляется. Но если вставить sleep (у меня 30 сек)
Код: Выделить весь код
............
    Set App = CreateObject("Shell.Application")
    Call App.Namespace(Zip).CopyHere(FileIn)

WScript.Sleep 30 * 1000

    If Err.Number <> 0 Then
............
то мой ноут времён куликовской битвы при запуске скрипта с cscript справляется с 190М

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


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


Отправлено: 18:35, 07-08-2019 | #9


Ветеран


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

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


megaloman, посмотрел. Дело совсем не в том, под каким хостом исполняется скрипт — wscript.exe/cscript.exe. Уберите завершающее:
Код: Выделить весь код
WScript.Echo "=== " + Zip + "  Done"
которое не даёт скрипту вовремя завершиться, и посмотрите на получившийся результат .

Повторяю, метод .CopyHere() работает асинхронно с поздним связыванием VBScript, посему — увы и ах .

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



Компьютерный форум 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




 
Переход