找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 27261|回复: 11

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

[复制链接]
发表于 2012-12-15 13:30:10 | 显示全部楼层 |阅读模式
  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文件夹”,怎么改?谢谢
 楼主| 发表于 2012-12-15 15:58:23 | 显示全部楼层
这样为什么不行呢?


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
发表于 2012-12-15 16:46:22 | 显示全部楼层
回复 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技术 +1 收起 理由
ww0000 + 1 谢谢指教!!

查看全部评分

 楼主| 发表于 2012-12-15 17:16:11 | 显示全部楼层
回复 3# apang


    多谢了,我是新手,请多指教!!
 楼主| 发表于 2012-12-21 19:27:34 | 显示全部楼层
回复 3# apang


    老师,如果要历遍子文件夹,这个脚本应该如何改呢?
谢谢!
发表于 2012-12-22 14:18:48 | 显示全部楼层
遍历子文件夹,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
 楼主| 发表于 2012-12-22 14:52:25 | 显示全部楼层
回复 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"
 楼主| 发表于 2012-12-22 19:38:07 | 显示全部楼层
回复 6# czjt1234


    老师的这个好像没有B文件夹吧?怎么对比?
另外:d:\1是什么意思?
发表于 2012-12-22 20:01:08 | 显示全部楼层
哦,d:\1是我测试时用的,忘记改了

你把 d:\1 改成  C:\B
 楼主| 发表于 2012-12-23 15:18:16 | 显示全部楼层
回复 9# czjt1234


    老师你测试过了吗?
我测试在D:\B 只能拷贝里面子文件夹的文件,其他文件不能拷贝,在包含中文字符的文件夹执行没反应!!
发表于 2012-12-23 21:05:00 | 显示全部楼层
整的好复杂,不知道有没有简单方法。。。
  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技术 +1 收起 理由
ww0000 + 1 感谢帮助!!!

查看全部评分

 楼主| 发表于 2012-12-24 16:03:27 | 显示全部楼层
回复 11# apang


    老师,您太厉害了!!!非常感谢您的帮助,问题完全解决!!谢谢!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 13:35 , Processed in 0.020706 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表