[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] 帮忙改VBS代码-比较两个文件夹,拷贝不同到文件到指定位置

  1. Dim fso, File
  2.     Dim PathA, PathB
  3.     Dim FilesInPathA
  4.     Set fso = CreateObject("Scripting.FileSystemObject")
  5.     Set PathA = fso.GetFolder("C:\A")  '获得路径A下的文件列表
  6.     For Each File In PathA.Files
  7.         FilesInPathA = FilesInPathA & "|" & File.Name
  8.     Next
  9.     Set PathB = fso.GetFolder("C:\B")  '获得路径B下的文件列表
  10.     For Each File In PathB.Files
  11.     If InStr(FilesInPathA, File.Name)=0 Then '判断此文件在路径A下是否存在
  12.     File.Delete false '如果不存在则删除
  13.         End If
  14.     Next
  15.     Set fso = Nothing
复制代码
以上代码是用于比较两个文件夹,删除“B文件夹”中与“A文件夹”中不同的文件,我现在要将删除功能改为拷贝功能,也就是说,将“B文件夹”中有,而A“文件夹”中没有的文件拷贝到“C文件夹”,怎么改?谢谢

这样为什么不行呢?


Dim fso, File
    Dim PathA, PathB
    Dim FilesInPathA
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set PathA = fso.GetFolder("C:\Documents and Settings\Administrator\桌面\VBS删除文件\1")  '获得路径A下的文件列表
    For Each File In PathA.Files
        FilesInPathA = FilesInPathA & "|" & File.Name
    Next
    Set PathB = fso.GetFolder("C:\Documents and Settings\Administrator\桌面\VBS删除文件\2")  '获得路径B下的文件列表
    For Each File In PathB.Files
    If InStr(FilesInPathA, File.Name)=False Then '判断此文件在路径A下是否存在
    File.copy PathA '如果不存在则拷贝
        End If
    Next
    Set fso = Nothing

TOP

回复 2# ww0000

没有找到的话,InStr返回的是0而不是false。InStr再加上大小写判断会保险一点。
试试这样看:
  1. Dim PathA,PathB,PathC,FSO,File
  2. PathA = "c:\A"
  3. PathB = "c:\B"
  4. PathC = "c:\C"
  5. Set FSO = CreateObject("Scripting.FileSystemObject")
  6. If Not FSO.FolderExists(PathC) Then FSO.CreateFolder(PathC)
  7. For Each File In FSO.GetFolder(PathB).Files
  8.    If Not FSO.FileExists(PathA &"\" & File.Name) Then
  9.       File.Copy PathC &"\"
  10.    End If
  11. Next
  12. MsgBox "OK"
复制代码
1

评分人数

    • ww0000: 谢谢指教!!技术 + 1

TOP

回复 3# apang


    多谢了,我是新手,请多指教!!

TOP

回复 3# apang


    老师,如果要历遍子文件夹,这个脚本应该如何改呢?
谢谢!

TOP

遍历子文件夹,FSO好象没这个功能

调用批处理命令dir /a:d/s/b
  1. set objWsh = CreateObject("Wscript.Shell")
  2. Set objExec = objwsh.Exec("cmd.exe /c dir /a:d/s/b d:\1")
  3. Do Until objExec.StdOut.AtEndOfStream
  4.     Call xcopy(objExec.StdOut.ReadLine)
  5. Loop
  6. Sub xcopy(pathB)
  7.     If pathB = "" Then Exit Sub
  8.     Dim PathA, PathC, FSO, File
  9.     PathA = "c:\A"
  10.     PathC = "c:\C"
  11.     Set FSO = CreateObject("Scripting.FileSystemObject")
  12.     If Not FSO.FolderExists(PathC) Then FSO.CreateFolder(PathC)
  13.     For Each File In FSO.GetFolder(PathB).Files
  14.        If Not FSO.FileExists(PathA &"\" & File.Name) Then
  15.           File.Copy PathC &"\"
  16.        End If
  17.     Next
  18.     MsgBox pathB & " OK"
  19. End Sub
复制代码
其实可以直接用批处理命令xcopy

QQ 20147578

TOP

回复 6# czjt1234
老师,以下是对比文件夹A和B,将B文件夹中有、而A文件夹中没有的文件,拷贝到C文件夹!你给的不能实现此功能!
Dim PathA,PathB,PathC,FSO,File
PathA = "c:\A"
PathB = "c:\B"
PathC = "c:\C"
Set FSO = CreateObject("Scripting.FileSystemObject")
If Not FSO.FolderExists(PathC) Then FSO.CreateFolder(PathC)
For Each File In FSO.GetFolder(PathB).Files
   If Not FSO.FileExists(PathA &"\" & File.Name) Then
      File.Copy PathC &"\"
   End If
Next
MsgBox "OK"

TOP

回复 6# czjt1234


    老师的这个好像没有B文件夹吧?怎么对比?
另外:d:\1是什么意思?

TOP

哦,d:\1是我测试时用的,忘记改了

你把 d:\1 改成  C:\B

QQ 20147578

TOP

回复 9# czjt1234


    老师你测试过了吗?
我测试在D:\B 只能拷贝里面子文件夹的文件,其他文件不能拷贝,在包含中文字符的文件夹执行没反应!!

TOP

整的好复杂,不知道有没有简单方法。。。
  1. PathA = "c:\A"
  2. PathB = "c:\B"
  3. PathC = "c:\C"
  4. Dim Str
  5. Set Ws = CreateObject("WScript.Shell")
  6. Set FSO = CreateObject("Scripting.FileSystemObject")
  7. Str = GetFileStr(PathA)
  8. XcopyFile PathB
  9. MsgBox "OK"
  10. Sub XcopyFile(SubPath)
  11.    For Each File In FSO.GetFolder(SubPath).Files
  12.       Name = "|" & File.Name & "|"
  13.       If InStr(LCase(Str),LCase(Name)) = 0 Then
  14.          Name = PathC & Right(File.Path,Len(File.Path) - Len(PathB))
  15.          Ws.Run "xcopy " & chr(34) & File.Path & chr(34) & " " &_
  16.          chr(34) & Left(Name,InStrRev(Name,"\")) & chr(34) & " /s",0
  17.       End If
  18.    Next
  19.    For Each Folder In FSO.GetFolder(SubPath).SubFolders
  20.       XcopyFile Folder.Path
  21.    Next
  22. End Sub
  23. Function GetFileStr(SubPath)
  24.    For Each File In FSO.GetFolder(SubPath).Files
  25.       Str = Str & File.Name & "|"
  26.    Next
  27.    For Each Folder In FSO.GetFolder(SubPath).SubFolders
  28.       GetFileStr Folder.Path
  29.    Next
  30.    GetFileStr = "|" & Str
  31. End Function
复制代码
1

评分人数

    • ww0000: 感谢帮助!!!技术 + 1

TOP

回复 11# apang


    老师,您太厉害了!!!非常感谢您的帮助,问题完全解决!!谢谢!!

TOP

返回列表