|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - Копирование файла из одной папки в другую в определенные интервалы времени (bat) |
|
|
CMD/BAT - Копирование файла из одной папки в другую в определенные интервалы времени (bat)
|
Новый участник Сообщения: 2 |
Добрый день уважаемые форумчане
Знаю, что такую задачу можно реализовать, с помощью bat файла, но не знаю как его написать, поэтому обращаюсь к Вам за помощью Есть папки : Откуда : T:\Откуда Куда : C:\Users\UserName\Desktop\Куда Необходимо чтобы bat файл, в 09 :00, в 12:00 и в 17:00, делал копию файла Презентация.pptx, который находится в папке Откуда и помещал его в папку Куда, при этом архивировал его в zip архив. Название архива должно состоять из названия копируемого файла, в нашем случае, это Презентация и даты и времени копирования. Например Презентация_дата копирования_время копирования Буду признателен за Вашу помощь |
|
Отправлено: 15:48, 06-08-2019 |
Ветеран Сообщения: 27449
|
Профиль | Отправить 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:
|
|
Отправлено: 16:56, 06-08-2019 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2728
|
Профиль | Отправить 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
|
Профиль | Отправить 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 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Цитата pinguindell:
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
|
Профиль | Отправить PM | Цитировать Цитата megaloman:
|
|
Отправлено: 14:00, 07-08-2019 | #6 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Iska, Скобки там не существенны, хотя лишнее - всегда во вред. Хуже, что скрипт работает корректно только при запуске посредством Wscript, с Cscript писАть в архив не хочет.
|
------- Отправлено: 16:43, 07-08-2019 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата 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 По умолчанию, в VBScript параметры передаются по ссылке (в стек кладётся не значение переменной-параметра, а ссылка на саму переменную-параметр), посему, если изменить значение аргумента внутри процедуры/функции — это отразится на значении самого переданного параметра (поскольку на самом деле работа идёт как раз с ним). Когда аргумент заключается в скобки — тем самым сначала вычисляется выражение в скобках, а затем уже это вычисленное значение передаётся в процедуру/функцию. В таких языках, как, например, AutoIt — там практически любой вызов оформляется скобками, а вот в VBScript — скобки используются только тогда, когда вызов осуществляется в правой части выражения. В противном случае скобки интерпретируются не как скобки при вызове процедуры/функции, а как необходимость вычисления выражения. Когда у нас имеется несколько параметров — ничего страшного, попытка такого вызова: приведёт к тому, что возникнет ошибка компиляции «Недопустимо использование скобок при вызове процедуры Sub». А вот если аргумент будет один, как в случае выше: — компилятор просто решит, что «ничего страшного, (strValue) — это просто выражение, которое надо вычислить и затем передать его значение в процедуру/функцию». Цитата megaloman:
|
||
Отправлено: 17:46, 07-08-2019 | #8 |
Ветеран Сообщения: 2728
|
Профиль | Отправить PM | Цитировать Iska, wscript.exe 1,4G съедает без проблем, сscript.exe и с 3 байтами не справляется. Но если вставить sleep (у меня 30 сек)
то мой ноут времён куликовской битвы при запуске скрипта с cscript справляется с 190М
|
------- Последний раз редактировалось megaloman, 07-08-2019 в 19:09. Отправлено: 18:35, 07-08-2019 | #9 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать megaloman, посмотрел. Дело совсем не в том, под каким хостом исполняется скрипт — wscript.exe/cscript.exe. Уберите завершающее:
которое не даёт скрипту вовремя завершиться, и посмотрите на получившийся результат ![]() Повторяю, метод .CopyHere() работает асинхронно с поздним связыванием VBScript, посему — увы и ах ![]() |
Отправлено: 19:02, 07-08-2019 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|