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

Аватара пользователя
Чтец123

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

Сообщение Чтец123 »

Добрый день Уважаемые пользователи форума.

Передо мной стоит задача провести копирование файлов только за текущую дату.

В 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
Аватара пользователя
megaloman

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

Сообщение megaloman »

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


For+Dir

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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

[spoiler]Код:
[/spoiler]

Код: Выделить всё

@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\""

Тут, в принципе, и батника не надо, команду можно ручками набрать
Аватара пользователя
Чтец123

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

Сообщение Чтец123 »

Цитата Чтец123:



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




Что такое 17036, что означает?




Цитата Чтец123:



корневая директория, в которой создаются подкаталоги с именами папок …, в этих папках лежат некоторое количество файлов
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.




То есть, одноуровневая структура каталогов, но не двух- и более, так?




Цитата Чтец123:



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




Если таких файлов окажется несколько? Если файлы окажутся с одинаковыми именами? Если в «конкретной папке» уже существует файл с таким же именем?
Аватара пользователя
Iska

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

Сообщение Iska »

Цитата Iska:



Что такое 17036, что означает?
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.




Дата в формате yyddd.




Цитата Iska:



То есть, одноуровневая структура каталогов, но не двух- и более, так?
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.




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




Цитата Iska:



Если таких файлов окажется несколько? Если файлы окажутся с одинаковыми именами? Если в «конкретной папке» уже существует файл с таким же именем?
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.




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

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

Сообщение Чтец123 »

Цитата Чтец123:



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




Расшифруйте, как перевести 036 в обыденный, человеческий вид.




Цитата Чтец123:



Трёхуровневая. Например я указываю C:\1\Inward как корневой каталог, в Inward-е в свою очередь подкаталоги, в которых подкаталоги (с именами приведёнными выше) в которых лежат файлы.
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.




Покажите вывод tree из «корневого» каталога.




Цитата Чтец123:



Файлов и будет не один или два, но файлы будут с разными именами (это остаётся под ответственностью пользователей).
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.




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




Цитата Чтец123:



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




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

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

Сообщение Iska »

Цитата Iska:



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




036 - это второе февраля, 36 порядковый день в году.




Цитата Iska:



Покажите вывод tree из «корневого» каталога.
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.




Я могу ошибаться, но вот он



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:



А если окажутся с одинаковыми? Ответственность пользователей — это, конечно, хорошо, но скрипт об этом ничего не знает, и должен знать, что делать в такой ситуации.
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.




В этом случае я не задумывался. По идее он просто копирует один из них.




Цитата Iska:



Я Вам верю. Но меня не Ваш скрипт интересует, а алгоритм поведения. Итак, если в конечном каталоге одноимённый файл уже существует — то его не надо перезаписывать поверх, так?
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.




Да, всё верно, перезаписывать сверху скрипт не должен.
Аватара пользователя
Чтец123

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

Сообщение Чтец123 »

Цитата Чтец123:



036 - это второе февраля, 36 порядковый день в году.
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.




Ясно.




Цитата Чтец123:



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




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




Цитата Чтец123:



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




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



И давайте уточним:


Цитата Чтец123:



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




— созданные сегодня или модифицированные сегодня?
Аватара пользователя
Iska

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

Сообщение Iska »

Цитата Iska:



Ошиблись . Я имел в виду вывод команды tree, дабы я наглядно мог представить структуру каталогов. Ибо я реально не вижу в Вашем ТЗ трёх уровней, только два.
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.




Эту папку я указываю в качестве DirPath, Z:\111\222\333\444, файлы будут лежать здесь Z:\111\222\333\444\550\1\17033 и здесь Z:\111\222\333\444\551\1\17033, ну и так далее, где то четыре поддиректории, с разными днями.




Цитата Iska:



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




Да, буду Вам благодарен.




Цитата Iska:



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




Важна именно дата создания, дата модифицирования не принимается во внимание.
Аватара пользователя
Чтец123

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

Сообщение Чтец123 »

Цитата 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%"
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.




Локально всё работает нормально, Спасибо Вам.

Но вот при попытке запустить на сетевом диске выходить проблема. Выходит ошибка переменная среды не определена, хотя сетевой диск подключен.

Подскажите пожалуйста необходимо что то добавить подключение сетевого диска?
Аватара пользователя
Чтец123

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

Сообщение Чтец123 »

Чтец123, ну, вот как-то так:



Скрытый текст

[spoiler]Код:
[/spoiler]

Код: Выделить всё

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
'=============================================================================
Ответить

Вернуться в «Скриптовые языки администрирования Windows»