VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.
-
Чтец123
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.
Добрый день Уважаемые пользователи форума.
Передо мной стоит задача провести копирование файлов только за текущую дату.
В 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
Передо мной стоит задача провести копирование файлов только за текущую дату.
В 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 - [решено] Копирование файлов из подкаталогов только за текущую дату.
Чтец123, Если VBS не принципиально (не вчитывался в приведенный Вами скрипт), то вот CMD:
For+Dir
[spoiler]Код: [/spoiler]
forfiles
[spoiler]Код: [/spoiler]
Или, если угодно,
Код:
Тут, в принципе, и батника не надо, команду можно ручками набрать
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:
(по дням юлианского календаря, к примеру 17036)
Что такое 17036, что означает?
Цитата Чтец123:
корневая директория, в которой создаются подкаталоги с именами папок …, в этих папках лежат некоторое количество файлов
То есть, одноуровневая структура каталогов, но не двух- и более, так?
Цитата Чтец123:
нужно скопировать только файл с конкретным расширением, именно за сегодняшний день, в конкретную папку, без копирования директории (только файл).
Если таких файлов окажется несколько? Если файлы окажутся с одинаковыми именами? Если в «конкретной папке» уже существует файл с таким же именем?
(по дням юлианского календаря, к примеру 17036)
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.
Что такое 17036, что означает?
Цитата Чтец123:
корневая директория, в которой создаются подкаталоги с именами папок …, в этих папках лежат некоторое количество файлов
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.
То есть, одноуровневая структура каталогов, но не двух- и более, так?
Цитата Чтец123:
нужно скопировать только файл с конкретным расширением, именно за сегодняшний день, в конкретную папку, без копирования директории (только файл).
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.
Если таких файлов окажется несколько? Если файлы окажутся с одинаковыми именами? Если в «конкретной папке» уже существует файл с таким же именем?
-
Iska
Re: VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.
Цитата Iska:
Что такое 17036, что означает?
Дата в формате yyddd.
Цитата Iska:
То есть, одноуровневая структура каталогов, но не двух- и более, так?
Трёхуровневая. Например я указываю C:\1\Inward как корневой каталог, в Inward-е в свою очередь подкаталоги, в которых подкаталоги (с именами приведёнными выше) в которых лежат файлы.
Цитата Iska:
Если таких файлов окажется несколько? Если файлы окажутся с одинаковыми именами? Если в «конкретной папке» уже существует файл с таким же именем?
Файлов и будет не один или два, но файлы будут с разными именами (это остаётся под ответственностью пользователей). А вот если конкретный файл уже существует то этот скрипт с ним ничего не делает, я проверял.
Что такое 17036, что означает?
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.
Дата в формате yyddd.
Цитата Iska:
То есть, одноуровневая структура каталогов, но не двух- и более, так?
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.
Трёхуровневая. Например я указываю C:\1\Inward как корневой каталог, в Inward-е в свою очередь подкаталоги, в которых подкаталоги (с именами приведёнными выше) в которых лежат файлы.
Цитата Iska:
Если таких файлов окажется несколько? Если файлы окажутся с одинаковыми именами? Если в «конкретной папке» уже существует файл с таким же именем?
VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.
Файлов и будет не один или два, но файлы будут с разными именами (это остаётся под ответственностью пользователей). А вот если конкретный файл уже существует то этот скрипт с ним ничего не делает, я проверял.
-
Чтец123
Re: VBS/WSH/JS - [решено] Копирование файлов из подкаталогов только за текущую дату.
Цитата Чтец123:
Дата в формате yyddd.
Расшифруйте, как перевести 036 в обыденный, человеческий вид.
Цитата Чтец123:
Трёхуровневая. Например я указываю C:\1\Inward как корневой каталог, в Inward-е в свою очередь подкаталоги, в которых подкаталоги (с именами приведёнными выше) в которых лежат файлы.
Покажите вывод tree из «корневого» каталога.
Цитата Чтец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:
Расшифруйте, как перевести 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:
Я Вам верю. Но меня не Ваш скрипт интересует, а алгоритм поведения. Итак, если в конечном каталоге одноимённый файл уже существует — то его не надо перезаписывать поверх, так?
Да, всё верно, перезаписывать сверху скрипт не должен.
Расшифруйте, как перевести 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:
036 - это второе февраля, 36 порядковый день в году.
Ясно.
Цитата Чтец123:
Я могу ошибаться,
Ошиблись
. Я имел в виду вывод команды tree, дабы я наглядно мог представить структуру каталогов. Ибо я реально не вижу в Вашем ТЗ трёх уровней, только два.
Цитата Чтец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:
Ошиблись . Я имел в виду вывод команды 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:
созданные сегодня или модифицированные сегодня?
Важна именно дата создания, дата модифицирования не принимается во внимание.
Ошиблись . Я имел в виду вывод команды 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 - [решено] Копирование файлов из подкаталогов только за текущую дату.
Цитата 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%"
Локально всё работает нормально, Спасибо Вам.
Но вот при попытке запустить на сетевом диске выходить проблема. Выходит ошибка переменная среды не определена, хотя сетевой диск подключен.
Подскажите пожалуйста необходимо что то добавить подключение сетевого диска?
@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, ну, вот как-то так:
Скрытый текст
[spoiler]Код: [/spoiler]
Скрытый текст
[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
'=============================================================================