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

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.

Ответить
Настройки темы
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.

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


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

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


Добрый день Уважаемые пользователи форума.
Передо мной стоит задача провести копирование файлов только за текущую дату.
В DirPath указана корневая директория, в которой создаются подкаталоги с именами папок (по дням юлианского календаря, к примеру 17036), в этих папках лежат некоторое количество файлов, нужно скопировать только файл с конкретным расширением, именно за сегодняшний день, в конкретную папку, без копирования директории (только файл).
У меня есть скрипт, но я никак не могу добавить туда фильтр по времени, не могли бы Вы помочь
Текст скрипта:

strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Const ForAppending = 8
Dim fso,NewFile,sFolder, Time, currentDate, DT, DateVal

Set objNetwork = CreateObject("WScript.Network")
Set fso = CreateObject("Scripting.FileSystemObject")

DirPath = "C:\Склады\"
TargetPath = "C:\1\Inward\22\"
Mask = ".x"

Function Format(N)
If N >= 10 Then
Format= Format & N
Else
Format= Format & "0" & N
End If
End Function
Set objFolder = fso.GetFolder(DirPath)

Set colSubfolders = objFolder.SubFolders
For Each objSubfolder in colSubfolders


varSrc = Replace(objSubfolder.Path, "\", "\\")
Set FileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name=""" & varSrc & """} Where " _
& "ResultClass = CIM_DataFile")
For Each objFile In FileList
On Error Resume Next

SFile = objFile.Drive & objFile.Path & _
objFile.FileName & "." & objFile.Extension

ext = Right(objFile.Extension, Len(objFile.Extension))
bufExt = objFile.Extension
Trgt_ext = TargetPattern & ext
strNewName = objFile.Drive & objFile.Path & _
objFile.FileName & "." & Trgt_ext


hh = Hour(Now)
mm = Minute(Now)
ss = Second(Now)
LogTime = format(hh)&":"&Format(mm)&":"&format(ss)


fso.CopyFile strNewName , TargetPath

Next
Next

Отправлено: 13:53, 08-02-2017

 

Ветеран


Contributor


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

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


Чтец123, Если VBS не принципиально (не вчитывался в приведенный Вами скрипт), то вот CMD:
For+Dir
Код: Выделить весь код
@Echo Off

Set "From=Z:\Box_In\*.js"
Set "To=Z:\Box_Out"

Set "Now=%Date%"

FOR /F "usebackq delims=" %%f IN (`Dir /B /S /A:-D /T:C "%From%" 2^>nul`) DO (
	FOR /F "usebackq tokens=1 delims= " %%d IN ('%%~tf') DO If "%Now%"=="%%d" Copy "%%f" "%To%\" >nul
)
forfiles
Код: Выделить весь код
@Echo Off

Set "From=Z:\Box_In"
Set "To=Z:\Box_Out"
Set "Mask=*.js"

Set "Comm=cmd /C >nul copy "@path" "%To%\""

FORFILES /P "%From%" /M "%Mask%" /S /D +0 /C "%Comm%"
Или, если угодно,
Код: Выделить весь код
@Echo Off
FORFILES /P "Z:\Box_In" /M "*.js" /S /D +0 /C "cmd /C >nul copy "@path" "Z:\Box_Out\""
Тут, в принципе, и батника не надо, команду можно ручками набрать

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


Последний раз редактировалось megaloman, 08-02-2017 в 20:13.

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

Отправлено: 19:23, 08-02-2017 | #2



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

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


Ветеран


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

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


Цитата Чтец123:
(по дням юлианского календаря, к примеру 17036) »
Что такое 17036, что означает?

Цитата Чтец123:
корневая директория, в которой создаются подкаталоги с именами папок …, в этих папках лежат некоторое количество файлов »
То есть, одноуровневая структура каталогов, но не двух- и более, так?

Цитата Чтец123:
нужно скопировать только файл с конкретным расширением, именно за сегодняшний день, в конкретную папку, без копирования директории (только файл). »
Если таких файлов окажется несколько? Если файлы окажутся с одинаковыми именами? Если в «конкретной папке» уже существует файл с таким же именем?

Отправлено: 07:48, 09-02-2017 | #3


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


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

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


Цитата Iska:
Что такое 17036, что означает? »
Дата в формате yyddd.

Цитата Iska:
То есть, одноуровневая структура каталогов, но не двух- и более, так? »
Трёхуровневая. Например я указываю C:\1\Inward как корневой каталог, в Inward-е в свою очередь подкаталоги, в которых подкаталоги (с именами приведёнными выше) в которых лежат файлы.

Цитата Iska:
Если таких файлов окажется несколько? Если файлы окажутся с одинаковыми именами? Если в «конкретной папке» уже существует файл с таким же именем? »
Файлов и будет не один или два, но файлы будут с разными именами (это остаётся под ответственностью пользователей). А вот если конкретный файл уже существует то этот скрипт с ним ничего не делает, я проверял.

Отправлено: 08:06, 09-02-2017 | #4


Ветеран


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

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


Цитата Чтец123:
Дата в формате yyddd. »
Расшифруйте, как перевести 036 в обыденный, человеческий вид.

Цитата Чтец123:
Трёхуровневая. Например я указываю C:\1\Inward как корневой каталог, в Inward-е в свою очередь подкаталоги, в которых подкаталоги (с именами приведёнными выше) в которых лежат файлы. »
Покажите вывод tree из «корневого» каталога.

Цитата Чтец123:
Файлов и будет не один или два, но файлы будут с разными именами (это остаётся под ответственностью пользователей). »
А если окажутся с одинаковыми? Ответственность пользователей — это, конечно, хорошо, но скрипт об этом ничего не знает, и должен знать, что делать в такой ситуации.

Цитата Чтец123:
А вот если конкретный файл уже существует то этот скрипт с ним ничего не делает, я проверял. »
Я Вам верю. Но меня не Ваш скрипт интересует, а алгоритм поведения. Итак, если в конечном каталоге одноимённый файл уже существует — то его не надо перезаписывать поверх, так?

Отправлено: 09:00, 09-02-2017 | #5


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


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

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


Цитата Iska:
Расшифруйте, как перевести 036 в обыденный, человеческий вид. »
036 - это второе февраля, 36 порядковый день в году.

Цитата Iska:
Покажите вывод tree из «корневого» каталога. »
Я могу ошибаться, но вот он

Set objFolder = fso.GetFolder(DirPath)

Set colSubfolders = objFolder.SubFolders
For Each objSubfolder in colSubfolders

varSrc = Replace(objSubfolder.Path, "\", "\\")
Set FileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name=""" & varSrc & """} Where " _
& "ResultClass = CIM_DataFile")
Но я не уверен, потому что начал работать с VBS совсем недавно.

Цитата Iska:
А если окажутся с одинаковыми? Ответственность пользователей — это, конечно, хорошо, но скрипт об этом ничего не знает, и должен знать, что делать в такой ситуации. »
В этом случае я не задумывался. По идее он просто копирует один из них.

Цитата Iska:
Я Вам верю. Но меня не Ваш скрипт интересует, а алгоритм поведения. Итак, если в конечном каталоге одноимённый файл уже существует — то его не надо перезаписывать поверх, так? »
Да, всё верно, перезаписывать сверху скрипт не должен.

Отправлено: 09:09, 09-02-2017 | #6


Ветеран


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

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


Цитата Чтец123:
036 - это второе февраля, 36 порядковый день в году. »
Ясно.

Цитата Чтец123:
Я могу ошибаться, »
Ошиблись . Я имел в виду вывод команды tree, дабы я наглядно мог представить структуру каталогов. Ибо я реально не вижу в Вашем ТЗ трёх уровней, только два.

Цитата Чтец123:
В этом случае я не задумывался. По идее он просто копирует один из них. »
Надо бы подумать. Копировать будет все подряд. Но, учитывая, что перезаписи быть не должно, будет скопирован только первый найденный, прочие будут пропущены. Так устроит?

И давайте уточним:
Цитата Чтец123:
за сегодняшний день »
— созданные сегодня или модифицированные сегодня?

Отправлено: 13:22, 09-02-2017 | #7


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


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

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


Цитата Iska:
Ошиблись . Я имел в виду вывод команды tree, дабы я наглядно мог представить структуру каталогов. Ибо я реально не вижу в Вашем ТЗ трёх уровней, только два. »
Эту папку я указываю в качестве DirPath, Z:\111\222\333\444, файлы будут лежать здесь Z:\111\222\333\444\550\1\17033 и здесь Z:\111\222\333\444\551\1\17033, ну и так далее, где то четыре поддиректории, с разными днями.

Цитата Iska:
Надо бы подумать. Копировать будет все подряд. Но, учитывая, что перезаписи быть не должно, будет скопирован только первый найденный, прочие будут пропущены. Так устроит? »
Да, буду Вам благодарен.

Цитата Iska:
созданные сегодня или модифицированные сегодня? »
Важна именно дата создания, дата модифицирования не принимается во внимание.

Отправлено: 14:54, 09-02-2017 | #8


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


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

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


Цитата megaloman:
@Echo Off
Set "From=Z:\Box_In"
Set "To=Z:\Box_Out"
Set "Mask=*.js"
Set "Comm=cmd /C >nul copy "@path" "%To%\""
FORFILES /P "%From%" /M "%Mask%" /S /D +0 /C "%Comm%" »
Локально всё работает нормально, Спасибо Вам.
Но вот при попытке запустить на сетевом диске выходить проблема. Выходит ошибка переменная среды не определена, хотя сетевой диск подключен.
Подскажите пожалуйста необходимо что то добавить подключение сетевого диска?

Отправлено: 15:29, 09-02-2017 | #9


Ветеран


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

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


Чтец123, ну, вот как-то так:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strSourceFolder
Dim strDestFolder
Dim strFileExt

Dim objFSO


strSourceFolder = "C:\Склады"
strDestFolder   = "C:\1\Inward\22"
strFileExt      = "x"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")

If objFSO.FolderExists(strSourceFolder) Then
	If objFSO.FolderExists(strDestFolder) Then
		ScanSubFolders objFSO.GetFolder(strSourceFolder), strFileExt
	Else
		WScript.Echo "Can't find destination folder [" & strDestFolder & "]."
		WScript.Quit 2
	End If
Else
	WScript.Echo "Can't find source folder [" & strSourceFolder & "]."
	WScript.Quit 1
End If
	
Set objFSO = Nothing

WScript.Quit 0
'=============================================================================

'=============================================================================
Sub ScanSubFolders(objFolder, strFileExt)
	Dim objFile
	Dim objSubFolder
	
	WScript.StdOut.WriteLine "[" & objFolder.Path & "]"
	
	For Each objFile In objFolder.Files
		If StrComp(objFSO.GetExtensionName(objFile.Name), strFileExt, vbTextCompare) = 0 Then
			If DateDiff("d", objFile.DateCreated, Now()) = 0 Then
				WScript.StdOut.Write vbTab & objFile.Name
				
				If Not objFSO.FileExists(objFSO.BuildPath(strDestFolder, objFile.Name)) Then
					objFile.Copy strDestFolder & "\", False
					WScript.StdOut.WriteLine " : copied into destination folder [" & strDestFolder & "]."
				Else
					WScript.StdOut.WriteLine " : already exists in destination folder [" & strDestFolder & "]."
				End If
			End If
		End If
	Next
	
	For Each objSubFolder In objFolder.SubFolders
		ScanSubFolders objSubFolder, strFileExt
	Next
End Sub
'=============================================================================
Это сообщение посчитали полезным следующие участники:

Отправлено: 15:51, 09-02-2017 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Копирование файлов за текущую дату! erorr Скриптовые языки администрирования Windows 14 27-10-2016 22:13
CMD/BAT - Копирование файлов по маске за текущую дату или пропуская ранее скопированные файлы jastreb83 Скриптовые языки администрирования Windows 3 19-08-2014 13:36
VBS/WSH/JS - Копирование файлов из каталогов и подкаталогов с сохранением структуры подкаталогов spke Скриптовые языки администрирования Windows 0 10-04-2013 23:58
CMD/BAT - нужно извлечь из архива определенные файлы за текущую дату alek2012 Скриптовые языки администрирования Windows 0 20-06-2012 15:24
CMD/BAT - копирование файлов за текущую дату с сервера на сервер 6a6yko Скриптовые языки администрирования Windows 10 21-06-2011 13:00




 
Переход