Показать полную графическую версию : Скрипт для копирования из 4 сетевых папок в одну
Возникла необходимость копирования текстовых файлов из 4 сетевых папок в одну. Я так понимаю для одной папки будет что-то типо такого:
Option Explicit
Dim objFSO
Dim strMask
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
With objFSO
For Each strMask In Array("*.txt")
.MoveFile .BuildPath("\\server1\share", strMask), "\\server2\Destination"
Next
End With
Set objFSO = Nothing
WScript.Quit 0
А как будет для 4 папок? Плюс есть сложность - в именах файла есть символы [ и ]
Поменять ненужный здесь цикл по маскам на цикл по ресурсам:
Option Explicit
Dim objFSO
Dim strPath
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
With objFSO
For Each strPath In Array("\\server1\share1", "\\server1\share2", "\\server2\share3", "\\server2\share4")
.MoveFile .BuildPath(strPath, "*.*"), "\\server2\Destination"
Next
End With
Set objFSO = Nothing
WScript.Quit 0
Плюс есть сложность - в именах файла есть символы [ и ] »
Никакой сложности, это не PowerShell.
Странно, ошибка выходит:
http://savepic.ru/4490257.jpg
то бишь там, где строчка Move..
.MoveFile .BuildPath(strPath, "*.*"), "\\server2\Destination\"
Боле подробный вариант:
Option Explicit
Dim objFSO
Dim arrSources
Dim strDestination
Dim strPath
arrSources = Array("\\server1\share1", "\\server1\share2", "\\server2\share3", "\\server2\share4")
strDestination = "\\server2\Destination"
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
With objFSO
For Each strPath In arrSources
If .FolderExists(strPath) Then
If .GetFolder(strPath).Files.Count > 0 Then
.MoveFile .BuildPath(strPath, "*.*"), strDestination & "\"
Else
WScript.Echo "Folder [" & strPath & "] not contain any files"
End If
Else
WScript.Echo "Folder [" & strPath & "] not found"
End If
Next
End With
Set objFSO = Nothing
WScript.Quit 0
lipro122
06-05-2013, 12:43
Вопрос 1.
А если файлы (папки) уже существуют , в "\\server2\Destination" ...
Они будут заменяться автоматически ???
Вопрос 2.
Как скопировать из 4-х папок, файлы удовлетворяющие атрибутам по дате создания ( например не старше 30 дней) ?.
А если файлы (папки) уже существуют , в "\\server2\Destination" ...
Они будут заменяться автоматически ??? »
Нет, не будут. Возникнет ошибка времени исполнения в момент попытки перемещения файла.
If destination is an existing file, an error occurs.
Два встречных вопроса:
Возникла необходимость копирования текстовых файлов из 4 сетевых папок в одну. Я так понимаю для одной папки будет что-то типо такого:
…
.MoveFile .BuildPath("\\server1\share", strMask), "\\server2\Destination"
… »
Я проглядел ранее этот момент. Так копирование или перемещение?
О каких папках — «если файлы (папки)» — идёт речь? Изначально говорилось только о текстовых файлах.
файлы удовлетворяющие атрибутам по дате создания ( например не старше 30 дней) ?. »
Менять логику скрипта, убирая работу по маскам (вот, кстати, тоже — не «*.*», а «*.txt») и перебирая файлы по одному, проверяя дату их создания и расширение. На мой взгляд, тут проще использовать PowerShell, с его расширенными возможностями по фильтрации.
Я проглядел ранее этот момент. Так копирование или перемещение?
О каких папках — «если файлы (папки)» — идёт речь? Изначально говорилось только о текстовых файлах. »
Необходимо перемещение. Речь идет о необходимости перемещать текстовые файлы. На powershell возникают проблемы из-за именования файлов - в именах содержатся символы [, ]. Использование LiteralPath что-то не помогает, вот и подумал о vbs. Про папки - ситуация такая: в четыре определённые папки на одном сервере происходит выгрузка результата в текстовом файле, из этих 4 папок необходимо все переместить в одну папку на другом сервере.
С этим:
А если файлы (папки) уже существуют , в "\\server2\Destination" ...
Они будут заменяться автоматически ??? »Нет, не будут. Возникнет ошибка времени исполнения в момент попытки перемещения файла. »
что решили делать?
Iska
Пока ничего. А какие могут быть варианты? В данном случае с одной стороны это может быть и хорошо, но желательно конечно чтобы имена файлов при перемещении переносились в лог на сетевом диске, чтобы было видно какие файлы перемещались. На powershell так и сделано, но там проблема с наименованием файлов с символами - он их просто не перемещает, если в файле нету символа - то все ок. Правда все файлы с символами.
Боле подробный вариант:
Код:
Option Explicit
Dim objFSO
Dim arrSources
Dim strDestination
Dim strPath
arrSources = Array("\\server1\share1", "\\server1\share2", "\\server2\share3", "\\server2\share4")
strDestination = "\\server2\Destination"
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
With objFSO
For Each strPath In arrSources
If .FolderExists(strPath) Then
If .GetFolder(strPath).Files.Count > 0 Then
.MoveFile .BuildPath(strPath, "*.*"), strDestination & "\"
Else
WScript.Echo "Folder [" & strPath & "] not contain any files"
End If
Else
WScript.Echo "Folder [" & strPath & "] not found"
End If
Next
End With
Set objFSO = Nothing
WScript.Quit 0 »
Возник вопрос - при выполнении в ручную скрипта, он перемещает файл и выводит окно, если нажать ОК, то переходит к следующей папке и тд.Или просто выводит сообщение, что файлов в такой-то папке файлов нет и переходит к другой. Если поставить в диспетчер задач - то задача просто весит и не заканчивается. Как сделать так,чтобы не выводилось окно о перемещении файла?Этот скрипт должен выполнятся каждые 10 минут
Если поставить в диспетчер задач »
Очевидно — планировщик задач.
то задача просто весит и не заканчивается. »
Скрипт вывел то же самое сообщение. Вы его не видите, поскольку для заданию, очевидно, не дано разрешения взаимодействовать с Рабочим столом текущего пользователя (такая настройка существует для заданий старого типа).
Вариантов несколько.
1. Закомментировать вывод сообщений апострофом:
'WScript.Echo "Folder [" & strPath & "] not contain any files"
.
2. Исполнять скрипт под консольным хостом «cscript.exe»:
cscript.exe //nologo "Путь\Имя.vbs"
а не умолчальным GUI-вариантом — «wscript.exe». Вывод будет идти в консоль, а не в MessageBox'ы. При запуске из-под планировщика Вы не увидите равно и окно консоли.
3. Вообще подавить вывод сообщений (в том числе и сообщений об ошибках):
cscript.exe //nologo //b "Путь\Имя.vbs"
или:
wscript.exe //b "Путь\Имя.vbs"
Большое спасибо, Iska.
Воспользовался первым вариантом.
А можете подсказать каким образом в дальнейшем сделать перемещение из 4 папкок в 4 другие соответствующие папки. То есть например перемещать из папки \\server1\share1 в \\server2\share1, \\server1\share2 в \\server2\share2 и так для четырех папок. А также возможно ли каким-то образом вносить имена перемещаемых файлов в лог?
Всё возможно. Но скажите, а каков глубинный смысл перемещения с одного ресурса на другой?
А можете подсказать как это реализовать?
А смысл простой - есть 4 папки на внешнем фтп. Туда заливаются отчеты в текстовых файлах. На первом этапе(тестовом) их необходимо перемещать с этого фтп в одну папку на другой сервер, второй - этап из каждой папки в соответствующую папку на втором сервере. А потом из 4 папкок уже на втором сервере происходит автоматическая обработка содержания файлов приложением и дальнейшее их распеределение в соответствующие директории.
Wsador, примерно так (не проверялось):
Option Explicit
Dim objFSO
Dim arrShare
Dim strSourceFolder
Dim strDestFolder
Dim objFile
Dim objFolder
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
For Each arrShare In Array( _
Array("\\server1\share1", "\\server2\share1"), _
Array("\\server1\share2", "\\server2\share2"), _
Array("\\server1\share3", "\\server2\share3"), _
Array("\\server1\share4", "\\server2\share4") _
)
strSourceFolder = arrShare(0)
strDestFolder = arrShare(1)
If objFSO.FolderExists(strSourceFolder) Then
If objFSO.FolderExists(strDestFolder) Then
With objFSO.GetFolder(strSourceFolder)
If .Files.Count > 0 Then
objFSO.MoveFile objFSO.BuildPath(strSourceFolder, "*.*"), strDestFolder & "\"
End If
If .SubFolders.Count > 0 Then
objFSO.MoveFolder objFSO.BuildPath(strSourceFolder, "*.*"), strDestFolder & "\"
End If
End With
Else
WScript.Echo "Destination folder [" & strDestFolder & "] not found."
End If
Else
WScript.Echo "Source folder [" & strSourceFolder & "] not found."
End If
Next
Set objFSO = Nothing
WScript.Quit 0
Iska
Спасибо, проверил -все работает. А возможно ли добавить логирование? Чтобы он заносил имя перемещаемых файлов в текстовый лог в сетевую папку на server2 - например в "\\server2\sharelogs"?
А возможно ли добавить логирование? »
Приношу свои извинения, запамятовал.
Чтобы он заносил имя перемещаемых файлов в текстовый лог … »
Нет, нельзя, поскольку в данном варианте используется перемещение по маске — «*.*».
Если очень нужно, можно попробовать перебором:
Option Explicit
Dim objFSO
Dim arrShare
Dim strSourceFolder
Dim strDestFolder
Dim objFile
Dim objFolder
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
For Each arrShare In Array( _
Array("\\server1\share1", "\\server2\share1"), _
Array("\\server1\share2", "\\server2\share2"), _
Array("\\server1\share3", "\\server2\share3"), _
Array("\\server1\share4", "\\server2\share4") _
)
strSourceFolder = arrShare(0)
strDestFolder = arrShare(1)
If objFSO.FolderExists(strSourceFolder) Then
If objFSO.FolderExists(strDestFolder) Then
With objFSO.GetFolder(strSourceFolder)
WScript.Echo "==========================================================="
WScript.Echo "Source folder: " & strSourceFolder
WScript.Echo "Destination folder: " & strDestFolder
WScript.Echo "-----------------------------------------------------------"
For Each objFolder In .SubFolders
WScript.Echo "[" & objFolder.Name & "]"
objFolder.Move strDestFolder & "\"
Next
For Each objFile In .Files
WScript.Echo objFile.Name
objFile.Move strDestFolder & "\"
Next
WScript.Echo "==========================================================="
WScript.Echo
End With
Else
WScript.Echo "Destination folder [" & strDestFolder & "] not found."
End If
Else
WScript.Echo "Source folder [" & strSourceFolder & "] not found."
End If
Next
Set objFSO = Nothing
WScript.Quit 0
Для вывода лога в файл используйте перенаправление вывода:
cscript.exe //nologo "Путь\Имя.vbs" >"\\server2\sharelogs\Out.log"
Iska
Все хорошо, только проблема с логом возникла. При запуске файла vbs с этим:
cscript.exe //nologo "Путь\Имя.vbs" >"\\server2\sharelogs\Out.log"Пишет ошибку - во вложении. Пробывал параметр //nologo и //b. На месте ошибки находятся начало скобок - /
Пишет ошибку - во вложении. »
Нажмите «Ctrl-C» в окне сообщения об ошибке. Получите текст в буфер обмена.
error.jpg »
Вы его пытались запускать не через «cscript.exe»?
На месте ошибки находятся начало скобок - / »
Wsador, упакуйте в архив и выложите Ваш «R:\SCRIPTS\test.vbs».
Цитата Iska:
Вы его пытались запускать не через «cscript.exe»? »
Имется ввиду через wscript.exe?
Цитата Iska:
Wsador, упакуйте в архив и выложите Ваш «R:\SCRIPTS\test.vbs». »
Во вложении
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.