【问题标题】:VB script - search for a file in directoryVB 脚本 - 在目录中搜索文件
【发布时间】:2013-04-10 05:12:55
【问题描述】:

我正在尝试编写一个 VB 脚本(以前从未尝试过) - 我需要它来搜索文件夹'\file001\source$' - 同时在文件夹中搜索所有 'Update.exe' 文件 - 如果这是手动完成,在 Windows 中需要很长时间! 我希望将它找到的具有此名称的所有文件复制到一个新文件夹中。

看着各种帮助论坛,我越来越糊涂了。

以下是我尝试过的:

Set fso = CreateObject("Scripting.FileSystemObject")
ShowSubfolders fso.GetFolder("\\file001\source$")

'文件夹名 = "\file001\source$" 'filename = "Updater.exe"

Function ShowSubFolders(Folder)
    For Each Subfolder in Folder.SubFolders
        Wscript.Echo Subfolder.Path
        ShowSubFolders Subfolder
    Next
End Function

这是通过文件夹搜索,递归地通过文件夹子文件夹查找所有具有此名称的文件。

我还研究了 -directory.getfiles。但不知道这是否是正确的方向。

作为 VB 脚本的新手,我研究并尝试使用 vb 脚本来获得我想要的功能。如果能得到任何帮助,我将不胜感激。

再次 - 我的目标是 - 找到给定文件夹和子文件夹中名为 update.exe 的所有文件 - 然后将找到的这些文件复制到新文件夹中。 提前谢谢你。

【问题讨论】:

标签: vbscript system-administration


【解决方案1】:
dim sFilename

Dim objDict
Set objDict=CreateObject("Scripting.Dictionary")
sFilename = ""

'root folder path where subfolder exists 
fileLocation="C:\Users\u258251\Desktop\TestSubfolder"

Dim objFSO 'File System Object
Set objFSO = CreateObject("Scripting.FileSystemObject")

'Add all files with specific extention to dictonary 

Call Recurse(fileLocation)



ItemArray = objDict.Items


'Loop through dictonary
For i = 0 To objDict.count -1
    sFilename = sFilename & ItemArray(i) & VBCRLF
Next 

msgbox(sFilename)

'find a specific file by name and return path 
if objDict.Exists("DP103.txt") then 
    msgbox(objDict.Item("DP103.txt")) 
end if

Sub Recurse(strFolderPath)
    Dim objFolder
    Set objFolder = objFSO.GetFolder(strFolderPath)
    Dim objFile
    Dim objSubFolder

    For Each objFile In objFolder.Files
        If (InStr(objFile.Name, ".") > 0) Then

            'proceed if extention is .txt 
            If (LCase(Mid(objFile.Name, InStrRev(objFile.Name, "."))) = ".txt") Then 
                if objDict.Exists(objFile.Name)=false then 
                'add files and path to dictonary 
                objDict.Add objFile.Name,objfile.Path 
                End if 
            End if 
        End If 
    Next

    For Each objSubFolder In objFolder.SubFolders
        Call Recurse(objSubFolder.Path)
    Next
End Sub

【讨论】:

  • objDict.Add objFile.Name,objfile.Path 将失败(即松散的文件),如果您在不同的文件夹中有同名的文件。
  • Ekkehard:抱歉之前的格式不正确,但在添加到字典之前会检查“if objDict.Exists(objFile.Name)=false then”
  • 请尝试理解问题(字典的键是唯一的)。
【解决方案2】:

如果您只想检查单个文件夹的内容是否存在特定文件,您可以这样做:

Set fso = CreateObject("Scripting.FileSystemObject")

foldername = "\\file001\source$"
filename   = "Update.exe"

If fso.FileExists(fso.BuildPath(foldername, filename)) Then
  WScript.Echo filename & " exists."
End If

如果您还想检查foldername 的子文件夹,您需要递归到带有this 之类的子文件夹。您可以将上述代码示例中的检查集成到子文件夹的循环中,或者在文件夹中的文件上添加另一个循环:

Set fso = CreateObject("Scripting.FileSystemObject")

CopyUpdater fso.GetFolder("\\file001\source$")

Sub CopyUpdater(fldr)
  For Each f In fldr.Files
    If LCase(f.Name) = "update.exe" Then
      'copy file to somewhere else
    End If
  Next

  For Each sf In fldr.SubFolders
    CopyUpdater sf
  Next
End Sub

【讨论】:

  • 感谢您在搜索单个文件方面的帮助 - 我已经在上面发布了我的更新 - 我正在努力检查子文件夹。
【解决方案3】:

在此处查看我的问题,我对三种语言(也包括 vbscript)进行了基准测试,它们使用完整的工作示例进行子目录遍历并针对该语言进行了优化。 benchmarks: does python have a faster way of walking a network folder?

【讨论】:

    【解决方案4】:

    这是一个很好的尝试。阅读以下链接的更多内容并更好地了解事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 1970-01-01
      • 2018-04-26
      相关资源
      最近更新 更多