Войти

Показать полную графическую версию : Скрипт для копирования из 4 сетевых папок в одну


Страниц : [1] 2

Wsador
02-05-2013, 22:20
Возникла необходимость копирования текстовых файлов из 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 папок? Плюс есть сложность - в именах файла есть символы [ и ]

Iska
03-05-2013, 00:01
Поменять ненужный здесь цикл по маскам на цикл по ресурсам:
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.

Wsador
03-05-2013, 11:27
Странно, ошибка выходит:
http://savepic.ru/4490257.jpg
то бишь там, где строчка Move..

Iska
03-05-2013, 23:29
.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 дней) ?.

Iska
06-05-2013, 18:57
А если файлы (папки) уже существуют , в "\\server2\Destination" ...
Они будут заменяться автоматически ??? »
Нет, не будут. Возникнет ошибка времени исполнения в момент попытки перемещения файла.
If destination is an existing file, an error occurs.

Два встречных вопроса:
Возникла необходимость копирования текстовых файлов из 4 сетевых папок в одну. Я так понимаю для одной папки будет что-то типо такого:

.MoveFile .BuildPath("\\server1\share", strMask), "\\server2\Destination"
… »
Я проглядел ранее этот момент. Так копирование или перемещение?

О каких папках — «если файлы (папки)» — идёт речь? Изначально говорилось только о текстовых файлах.

файлы удовлетворяющие атрибутам по дате создания ( например не старше 30 дней) ?. »
Менять логику скрипта, убирая работу по маскам (вот, кстати, тоже — не «*.*», а «*.txt») и перебирая файлы по одному, проверяя дату их создания и расширение. На мой взгляд, тут проще использовать PowerShell, с его расширенными возможностями по фильтрации.

Wsador
08-05-2013, 07:50
Я проглядел ранее этот момент. Так копирование или перемещение?
О каких папках — «если файлы (папки)» — идёт речь? Изначально говорилось только о текстовых файлах. »
Необходимо перемещение. Речь идет о необходимости перемещать текстовые файлы. На powershell возникают проблемы из-за именования файлов - в именах содержатся символы [, ]. Использование LiteralPath что-то не помогает, вот и подумал о vbs. Про папки - ситуация такая: в четыре определённые папки на одном сервере происходит выгрузка результата в текстовом файле, из этих 4 папок необходимо все переместить в одну папку на другом сервере.

Iska
08-05-2013, 18:42
С этим:
А если файлы (папки) уже существуют , в "\\server2\Destination" ...
Они будут заменяться автоматически ??? »Нет, не будут. Возникнет ошибка времени исполнения в момент попытки перемещения файла. »
что решили делать?

Wsador
09-05-2013, 15:53
Iska
Пока ничего. А какие могут быть варианты? В данном случае с одной стороны это может быть и хорошо, но желательно конечно чтобы имена файлов при перемещении переносились в лог на сетевом диске, чтобы было видно какие файлы перемещались. На powershell так и сделано, но там проблема с наименованием файлов с символами - он их просто не перемещает, если в файле нету символа - то все ок. Правда все файлы с символами.

Wsador
16-05-2013, 13:02
Боле подробный вариант:
Код:
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 минут

Iska
16-05-2013, 13:33
Если поставить в диспетчер задач »
Очевидно — планировщик задач.

то задача просто весит и не заканчивается. »
Скрипт вывел то же самое сообщение. Вы его не видите, поскольку для заданию, очевидно, не дано разрешения взаимодействовать с Рабочим столом текущего пользователя (такая настройка существует для заданий старого типа).

Вариантов несколько.

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"

Wsador
17-05-2013, 09:54
Большое спасибо, Iska.
Воспользовался первым вариантом.
А можете подсказать каким образом в дальнейшем сделать перемещение из 4 папкок в 4 другие соответствующие папки. То есть например перемещать из папки \\server1\share1 в \\server2\share1, \\server1\share2 в \\server2\share2 и так для четырех папок. А также возможно ли каким-то образом вносить имена перемещаемых файлов в лог?

Iska
17-05-2013, 11:16
Всё возможно. Но скажите, а каков глубинный смысл перемещения с одного ресурса на другой?

Wsador
17-05-2013, 11:34
А можете подсказать как это реализовать?
А смысл простой - есть 4 папки на внешнем фтп. Туда заливаются отчеты в текстовых файлах. На первом этапе(тестовом) их необходимо перемещать с этого фтп в одну папку на другой сервер, второй - этап из каждой папки в соответствующую папку на втором сервере. А потом из 4 папкок уже на втором сервере происходит автоматическая обработка содержания файлов приложением и дальнейшее их распеределение в соответствующие директории.

Iska
17-05-2013, 13:58
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

Wsador
18-05-2013, 13:01
Iska
Спасибо, проверил -все работает. А возможно ли добавить логирование? Чтобы он заносил имя перемещаемых файлов в текстовый лог в сетевую папку на server2 - например в "\\server2\sharelogs"?

Iska
18-05-2013, 19:46
А возможно ли добавить логирование? »
Приношу свои извинения, запамятовал.

Чтобы он заносил имя перемещаемых файлов в текстовый лог … »
Нет, нельзя, поскольку в данном варианте используется перемещение по маске — «*.*».

Если очень нужно, можно попробовать перебором:
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"

Wsador
20-05-2013, 14:21
Iska
Все хорошо, только проблема с логом возникла. При запуске файла vbs с этим:
cscript.exe //nologo "Путь\Имя.vbs" >"\\server2\sharelogs\Out.log"Пишет ошибку - во вложении. Пробывал параметр //nologo и //b. На месте ошибки находятся начало скобок - /

Iska
20-05-2013, 14:58
Пишет ошибку - во вложении. »
Нажмите «Ctrl-C» в окне сообщения об ошибке. Получите текст в буфер обмена.

error.jpg »
Вы его пытались запускать не через «cscript.exe»?

На месте ошибки находятся начало скобок - / »
Wsador, упакуйте в архив и выложите Ваш «R:\SCRIPTS\test.vbs».

Wsador
20-05-2013, 15:17
Цитата Iska:
Вы его пытались запускать не через «cscript.exe»? »
Имется ввиду через wscript.exe?
Цитата Iska:
Wsador, упакуйте в архив и выложите Ваш «R:\SCRIPTS\test.vbs». »
Во вложении




© OSzone.net 2001-2012