Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Скрипт для копирования из 4 сетевых папок в одну (http://forum.oszone.net/showthread.php?t=259845)

Wsador 02-05-2013 22:20 2143490

Скрипт для копирования из 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 папок? Плюс есть сложность - в именах файла есть символы [ и ]

Iska 03-05-2013 00:01 2143512

Поменять ненужный здесь цикл по маскам на цикл по ресурсам:
Код:

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

Цитата:

Цитата Wsador
Плюс есть сложность - в именах файла есть символы [ и ] »

Никакой сложности, это не PowerShell.

Wsador 03-05-2013 11:27 2143622

Странно, ошибка выходит:

то бишь там, где строчка Move..

Iska 03-05-2013 23:29 2144029

Код:

                .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 2145262

Вопрос 1.

А если файлы (папки) уже существуют , в "\\server2\Destination" ...
Они будут заменяться автоматически ???

Вопрос 2.

Как скопировать из 4-х папок, файлы удовлетворяющие атрибутам по дате создания ( например не старше 30 дней) ?.

Iska 06-05-2013 18:57 2145512

Цитата:

Цитата lipro122
А если файлы (папки) уже существуют , в "\\server2\Destination" ...
Они будут заменяться автоматически ??? »

Нет, не будут. Возникнет ошибка времени исполнения в момент попытки перемещения файла.
Цитата:

If destination is an existing file, an error occurs.
Два встречных вопроса:
Цитата:

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


    .MoveFile .BuildPath("\\server1\share", strMask), "\\server2\Destination"

»

Я проглядел ранее этот момент. Так копирование или перемещение?

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

Цитата:

Цитата lipro122
файлы удовлетворяющие атрибутам по дате создания ( например не старше 30 дней) ?. »

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

Wsador 08-05-2013 07:50 2146393

Цитата:

Цитата Iska
Я проглядел ранее этот момент. Так копирование или перемещение?
О каких папках — «если файлы (папки)» — идёт речь? Изначально говорилось только о текстовых файлах. »

Необходимо перемещение. Речь идет о необходимости перемещать текстовые файлы. На powershell возникают проблемы из-за именования файлов - в именах содержатся символы [, ]. Использование LiteralPath что-то не помогает, вот и подумал о vbs. Про папки - ситуация такая: в четыре определённые папки на одном сервере происходит выгрузка результата в текстовом файле, из этих 4 папок необходимо все переместить в одну папку на другом сервере.

Iska 08-05-2013 18:42 2146693

С этим:
Цитата:

Цитата Iska
Цитата:

Цитата lipro122
А если файлы (папки) уже существуют , в "\\server2\Destination" ...
Они будут заменяться автоматически ??? »

Нет, не будут. Возникнет ошибка времени исполнения в момент попытки перемещения файла. »

что решили делать?

Wsador 09-05-2013 15:53 2147175

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

Wsador 16-05-2013 13:02 2150965

Цитата:

Цитата Iska
Боле подробный вариант:
Код:
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 2150982

Цитата:

Цитата Wsador
Если поставить в диспетчер задач »

Очевидно — планировщик задач.

Цитата:

Цитата Wsador
то задача просто весит и не заканчивается. »

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

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

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 2151414

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

Iska 17-05-2013 11:16 2151453

Всё возможно. Но скажите, а каков глубинный смысл перемещения с одного ресурса на другой?

Wsador 17-05-2013 11:34 2151472

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

Iska 17-05-2013 13:58 2151537

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 2152006

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

Iska 18-05-2013 19:46 2152191

Цитата:

Цитата Wsador
А возможно ли добавить логирование? »

Приношу свои извинения, запамятовал.

Цитата:

Цитата 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)
                                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 2152974

Вложений: 1
Iska
Все хорошо, только проблема с логом возникла. При запуске файла vbs с этим:
Код:

cscript.exe //nologo "Путь\Имя.vbs" >"\\server2\sharelogs\Out.log"
Пишет ошибку - во вложении. Пробывал параметр //nologo и //b. На месте ошибки находятся начало скобок - /

Iska 20-05-2013 14:58 2152993

Цитата:

Цитата Wsador
Пишет ошибку - во вложении. »

Нажмите «Ctrl-C» в окне сообщения об ошибке. Получите текст в буфер обмена.


Цитата:

Цитата Wsador
error.jpg »

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

Цитата:

Цитата Wsador
На месте ошибки находятся начало скобок - / »

Wsador, упакуйте в архив и выложите Ваш «R:\SCRIPTS\test.vbs».

Wsador 20-05-2013 15:17 2153006

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

Iska 20-05-2013 15:43 2153019

Как Вы запускаете — теперь:
Цитата:

Цитата Wsador
Во вложении »

разобрались. Но я имел в виду сам скрипт. Упакуйте в архив и выложите сам скрипт (теперь он у Вас зовётся «R:\SCRIPTS\moveftpfiles.vbs»).


Время: 10:39.

Время: 10:39.
© OSzone.net 2001-