Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - ASP и VBScript

Страница: 1 |

 

  Вопрос: копирование новых файлов На vbs Добавлено: 19.12.06 17:33  

Автор вопроса:  alroy
у меня такая проблема мне нужно из одной директории (папка на сервере )скопировать файлы в другую директорию но токо новые я скрипт нарыл в инете изменил под себя но проблема в том что етот скрипт мне нужно применять к разным папкам например из 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
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #1 Добавлено: 19.12.06 21:11
Или я невъехал в вопрос, или см свой код!

FolderName="C:\tmp\"'Директория куда копировать
CopyName="C:\util\vbs\vbs2\3\q\"'Директория откуда копировать

Ответить

Номер ответа: 2
Автор ответа:
 alroy



Вопросов: 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
Автор ответа:
 alroy



Вопросов: 3
Ответов: 28
 Профиль | | #5 Добавлено: 20.12.06 18:00
спасибо большое очень красивое решение но как я понял скорее всего оно меня не спасет !!!!!!!!
и вот из за чего у меня в коде сравнивается не сам файл а токо имя без расширения:
 p= Left(File.Name, InStrRev(File.Name, ".";)-1)
 а как это сделать в вашем коде пока не сообразил :(
вот из за этого 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
Автор ответа:
 alroy



Вопросов: 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, ".";)-1)
    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, ".";)-1)
  
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, ".";)-1)
   
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
Автор ответа:
 alroy



Вопросов: 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 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам