Страница: 1 |
Вопрос: копирование новых файлов На vbs | Добавлено: 19.12.06 17:33 |
Автор вопроса: ![]() |
у меня такая проблема мне нужно из одной директории (папка на сервере )скопировать файлы в другую директорию но токо новые я скрипт нарыл в инете изменил под себя но проблема в том что етот скрипт мне нужно применять к разным папкам например из c:\temp1 в с:\ppp1 из с:\temp2 в c:\ppp2
вот ето то и не получаеться вот мой скрипт '========================================================================== ' ' VBScript Source File -- Created with SAPIEN Technologies PrimalScript 4.0 ' ' NAME: ' ' AUTHOR: alroy , a ' DATE : 31.10.2006 ' ' ' COMMENT: Копирует файлы из одной директории в другую, при совпадении ' имен в директориях, копирование не производится ' '============================================================== ' ' '==Функция для проверки есть ли файл с заданным именем в директории= Function MyF(Name) Dim S Set FSO=WScript.CreateObject("Scripting.FileSystemObject") 'Создаем объект Folder для папки куда копировать Set F=FSO.GetFolder(FolderName) 'Создаем коллекцию файлов (путь предыдущего шага) Set CollFile=F.Files S="Копируем" ' Цикл по элементам коллекции для поиска совпадений имен For Each File In CollFile If Name= Left(File.Name, InStrRev(File.Name, ".")-1) Then S="Некопируем" 'WSH.Echo Mid (File.Name,InStrrev(File.name,".")) 'WSH.Echo Left(File.Name, InStrRev(File.Name, ".")-1) End If Next MyF=S End Function '==========Конец функции========================== FolderName="C:\tmp\"'Директория куда копировать CopyName="C:\util\vbs\vbs2\3\q\"'Директория откуда копировать Dim FolderName,CopyName,i,p,pa i=0 Set FSO=WSH.CreateObject("Scripting.FileSystemObject") 'Создаем объект Folder откуда будем копировать Set Fold=FSO.GetFolder(CopyName) 'Коллекция файлов для копирования Set ColFil=Fold.Files 'Цикл по коллекции For Each File In ColFil 'Вытаскиваем имя файла p= Left(File.Name, InStrRev(File.Name, ".")-1) pa = File.name Set FSO=WScript.CreateObject("Scripting.FileSystemObject") 'Создаем объект файл Set File=FSO.GetFile(CopyName & pa) 'Вызываем функцию If MyF(p)="Копируем" Then 'Если в директории нет файла с именем File.Name копируем FSO.CopyFile CopyName & pa,FolderName 'Здесь так для сервиса i=i+1 End If 'Переходим к следующему файлу Next 'Для сервиса если не нравится закоментируйте WSH.Echo "Скопированно " & i & " файлов" Set FSO=Nothing Set Fold=Nothing Set ColFil=Nothing |
Ответы | Всего ответов: 11 |
Номер ответа: 1 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client Вопросов: 236 Ответов: 8362 |
Профиль | Цитата | #1 | Добавлено: 19.12.06 21:11 |
Или я невъехал в вопрос, или см свой код!
FolderName="C:\tmp\"'Директория куда копировать
CopyName="C:\util\vbs\vbs2\3\q\"'Директория откуда копировать |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 3 Ответов: 28 |
Профиль | Цитата | #2 | Добавлено: 20.12.06 08:18 |
дак проблема в том и есть что у меня будет куча разных папок откуда и куда копировать !!!!!! и как ето сделать ??мне надо будет менять
FolderName="C:\tmp\" CopyName="C:\util\vbs\vbs2\3\q\" FolderName="C:\tmp2\" CopyName="C:\util2\" FolderName="C:\tmp3\" CopyName="C:\util3\" как вот ето сделать ??? |
Номер ответа: 3 Автор ответа: ![]() ![]() ICQ: 250543104 Вопросов: 13 Ответов: 118 |
Профиль | Цитата | #3 | Добавлено: 20.12.06 12:47 |
'On Error Resume Next strFolderSrc="c:\temp\" strFolderDst="c:\temp1\" If Not Right(strFolderSrc,1)="\" Then strFolderSrc=strFolderSrc & "\" If Not Right(strFolderDst,1)="\" Then strFolderDst=strFolderDst & "\" Wscript.Echo "Скопировано из " & strFolderSrc & " в " & strFolderDst & " " & FilesCopied(strFolderSrc, strFolderDst) & " файл(а,ов)" Wscript.Quit Function FilesCopied(src, dst) counter=0 Set objFSO=Createobject("Scripting.Filesystemobject" ![]() Set objSrc=objFSO.GetFolder (src) Set objFiles=objSrc.Files For Each objFile in objFiles ' ' any code you want ' n=objFile.Name If Not objFSO.FileExists(dst & n) Then counter=counter + 1 objFSO.CopyFile src & objFile.Name, dst & n End If Next FilesCopied=counter End Function проверяйте код. если надо - ставь в начале On Error Resume Next |
Номер ответа: 4 Автор ответа: ![]() ![]() ICQ: 250543104 Вопросов: 13 Ответов: 118 |
Профиль | Цитата | #4 | Добавлено: 20.12.06 13:50 |
черт! с точки зрения "правильности" кода, If Not Right(bla-bla-bla) надо поместить внутрь функции ![]() |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 3 Ответов: 28 |
Профиль | Цитата | #5 | Добавлено: 20.12.06 18:00 |
спасибо большое очень красивое решение но как я понял скорее всего оно меня не спасет !!!!!!!!
и вот из за чего у меня в коде сравнивается не сам файл а токо имя без расширения: p= Left(File.Name, InStrRev(File.Name, "." ![]() а как это сделать в вашем коде пока не сообразил ![]() вот из за этого If Not objFSO.FileExists(dst & n) дело в том что там расширения будут разными например aaa.txt и aaa.xor дак вот в этом случае тоже не надо копировать !! |
Номер ответа: 6 Автор ответа: ![]() ![]() ICQ: 250543104 Вопросов: 13 Ответов: 118 |
Профиль | Цитата | #6 | Добавлено: 21.12.06 06:39 |
'On Error Resume Next strFolderSrc="c:\temp\" strFolderDst="c:\temp1\" If Not Right(strFolderSrc,1)="\" Then strFolderSrc=strFolderSrc & "\" If Not Right(strFolderDst,1)="\" Then strFolderDst=strFolderDst & "\" Wscript.Echo "Скопировано из " & strFolderSrc & " в " & strFolderDst & " " & FilesCopied(strFolderSrc, strFolderDst) & " файл(а,ов)" Wscript.Quit Function FilesCopied(src, dst) counter=0 Set objFSO=Createobject("Scripting.Filesystemobject" ![]() Set objSrc=objFSO.GetFolder (src) Set objFiles=objSrc.Files For Each objFile in objFiles If FileExists(dst, objFile.Name)=False Then counter=counter + 1 objFSO.CopyFile src & objFile.Name, dst & objFile.Name End If Next FilesCopied=counter End Function Function FileExists(dst, Filename) FileExists=False arr1=Split(lcase(Filename),"." ![]() fn="" For i=0 To Ubound(arr1)-1 fn=fn & arr1(i) & "." Next Set objFSO=Createobject("Scripting.Filesystemobject" ![]() Set objFolder=objFSO.GetFolder(dst) Set objFiles=objFolder.Files Wscript.Echo FileName For Each objFile in objFiles fn1="" arr=Split(lcase(objFile.Name),"." ![]() For i=0 To Ubound(arr) fn1=fn1 & arr(i) & "." Next If fn=fn1 Then FileExists=True: Exit For Next Set objFiles=Nothing Set objFolder=Nothing Set objFSO=Nothing End Function ну е-мое!!! |
Номер ответа: 7 Автор ответа: ![]() ![]() ICQ: 250543104 Вопросов: 13 Ответов: 118 |
Профиль | Цитата | #7 | Добавлено: 21.12.06 06:43 |
кстати, alroy, непонятно, почему ты из имени файла берешь только первое вхождение точки
в Windows в имени файла точек может быть хоть сколько P.S. во второй функции закомментируй Wscript.Echo |
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 3 Ответов: 28 |
Профиль | Цитата | #8 | Добавлено: 21.12.06 12:08 |
слушай а я решил эту проблему по другому сравни незнаю какой лучше способ лучше !!!!
'========================================================================== ' ' VBScript Source File -- Created with SAPIEN Technologies PrimalScript 4.0 ' ' NAME: ' ' AUTHOR: alroy , post ' DATE : 20.12.2006 ' ' COMMENT: ' Вложенные циклы for each '========================================================================== FolderName="C:\tmp\"'Директория куда копировать CopyName="C:\util\vbs\vbs2\3\q\"'Директория откуда копировать strFolderSrc="c:\temp\" strFolderDst="c:\temp1\" Wscript.Echo "Скопировано из " & strFolderSrc & " в " & strFolderDst & " " & FilesCopied(strFolderSrc, strFolderDst) & " файл(а,ов)" Wscript.Echo "Скопировано из " & CopyName & " в " & FolderName & " " & FilesCopied(CopyName, FolderName) & " файл(а,ов)" Function FilesCopied(fold_int, copy_int) counter=0 Dim S,Found,p Set FSO=WScript.CreateObject("Scripting.FileSystemObject" ![]() Set Fold=FSO.GetFolder(copy_int) Set ColFil=Fold.Files 'Цикл по коллекции For Each File_b In ColFil S = Left(File_b.Name, InStrRev(File_b.Name, "." ![]() pa = File_b.name Set F=FSO.GetFolder(fold_int) Set CollFile=F.Files Found = True For Each File In CollFile p = Left(File.Name, InStrRev(File.Name, "." ![]() If S = p Then Found = False End If Next If Found = True Then Set File_b=FSO.GetFile(copy_int & pa) counter=counter + 1 FSO.CopyFile copy_int & pa,FolderName End If Next FilesCopied=counter End Function |
Номер ответа: 9 Автор ответа: ![]() ![]() ICQ: 250543104 Вопросов: 13 Ответов: 118 |
Профиль | Цитата | #9 | Добавлено: 21.12.06 12:38 |
1) если InstrRev <=1 - Left не сможет выполнить операцию
практически это может и не встретиться, но на всякий случай. 2) если работаешь со строками, которые будешь сравнивать - делай их одного регистра, функции Lcase или Ucase на твой личный выбор 3) очищай объект, после того как закончил с ним работать Set obj = Nothing в частности после For Each File In CollFile
p = Left(File.Name, InStrRev(File.Name, "." ![]() If S = p Then Found = False End If Next нао делать Set F = Nothing Set CollFile = Nothing 4) конструкция Set File_b=FSO.GetFile(copy_int & pa)
мне кажется лишней. CopyFile мы можем и так сделать. а в целом - все правильно |
Номер ответа: 10 Автор ответа: ![]() ![]() ![]() ![]() Вопросов: 3 Ответов: 28 |
Профиль | Цитата | #10 | Добавлено: 21.12.06 13:40 |
спасибо !!!!! а какой из них быстрее будет работать???? |
Номер ответа: 11 Автор ответа: ![]() ![]() ICQ: 250543104 Вопросов: 13 Ответов: 118 |
Профиль | Цитата | #11 | Добавлено: 21.12.06 13:44 |
ну ты даешь!
x=Now в начале моего варианта Wscript.Echo Now-x перед Wscript.Quit а у тебя: x=Now в начале Wscript.Echo Now-x После последней Wscript.Echo "Скопировано из " bla-bla-bla вот и сравнивай |
Страница: 1 |
|