【问题标题】:VBScript to Move files with particular extensionVBScript 移动具有特定扩展名的文件
【发布时间】:2015-03-09 22:02:21
【问题描述】:

我目前有一个 VBscript,它可以扫描文件夹中的文件并根据文件名中的关键字将文件移动到特定文件夹。

我目前需要脚本只扫描一个级别(即不递归扫描),我也需要搜索所有子文件夹。

有人可以帮我解决这个问题吗?

编辑:自从编写此脚本以来,我意识到我只需要根据文件名将具有特定扩展名的文件从特定文件夹和子文件夹移动到其他目录。 例如,我只需要移动 .mp4 和 .avi 文件。

有人可以帮我解决这个问题吗?我尝试了多种方法,但仍然无法进行递归扫描和移动或扩展特定的移动工作。

以下是我当前的脚本。

'========================================================
' Script to Move Downloaded TV Shows and Movies to
' correct folders based on wildcards in File Name
'========================================================

On Error Resume Next

Dim sTorrents, sTV, sMovie, sFile, oFSO

' create the filesystem object
Set oFSO = WScript.CreateObject("Scripting.FileSystemObject")

' Create Log File
Set objLog = oFSO.OpenTextFile("c:\temp\log.txt", 8, True)

' Set Variables
sTorrents = "C:\Temp\torrents\"
sTV = "C:\Temp\TV Shows\"
sMovie = "C:\Temp\Movies\"

' Scan each file in the folder
For Each sFile In oFSO.GetFolder(sTorrents).Files
' check if the file name contains TV Show Parameters
If InStr(1, sFile.Name, "hdtv", 1) OR InStr(1, sFile.Name, "s0", 1) <> 0 Then
    ' TV Show Detected - Move File
    objLog.WriteLine Now() & " - " & sFile.Name & " Detected as TV Show - Moving to " & sTV
    oFSO.MoveFile sTorrents & sFile.Name, sTV & sFile.Name
' Move all other Files to Movies Directory
Else objLog.WriteLine Now() & " - " & sFile.Name & " Detected as Movie - Moving to " & sMovie
    oFSO.MoveFile sTorrents & sFile.Name, sMovie & sFile.Name
End If

Next

If sTorrents.File.Count = 0 And sTorrents.SubFolders.Count = 0 Then
    objLog.WriteLine Now() & " - There is nothing left to Process..."
    objLog.Close
End If

【问题讨论】:

    标签: vbscript


    【解决方案1】:

    一些注意事项:

    Sub listfolders(startfolder)
    Dim fs 
    Dim fl1 
    Dim fl2 
    
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set fl1 = fs.GetFolder(startfolder)
    
        For Each fl2 In fl1.SubFolders
            Debug.Print fl2.Path
    
            ''process the files
            ProcessFiles fl2.Path 
    
            'Recursion: lists folders for each subfolder
            listfolders fl2.Path
        Next
    End Sub
    
    ''Code copied from question
    Sub ProcessFiles(sPath)
        ' Scan each file in the folder
        For Each sFile In oFSO.GetFolder(sPath).Files
            ' check if the file name contains TV Show Parameters
            If InStr(1, sFile.Name, "hdtv", 1) OR InStr(1, sFile.Name, "s0", 1) <> 0 Then
                ' TV Show Detected - Move File
                objLog.WriteLine Now() & " - " _
                      & sFile.Name & " Detected as TV Show - Moving to " & sTV
                oFSO.MoveFile sTorrents & sFile.Name, sTV & sFile.Name
            ' Move all other Files to Movies Directory
            Else 
                objLog.WriteLine Now() & " - " _
                & sFile.Name & " Detected as Movie - Moving to " & sMovie
                oFSO.MoveFile sTorrents & sFile.Name, sMovie & sFile.Name
            End If
        Next
    End Sub
    

    【讨论】:

    • 我不太确定如何在我的脚本中实现这一点?我还需要能够在子文件夹项上运行上述代码。
    【解决方案2】:

    在扩展名之前放置一个*,它将找到具有该扩展名的所有文件。 示例:oFSO.MoveFile (PATH\*.EXTERNSION)

    【讨论】:

      【解决方案3】:

      这是一个列出文件夹和子文件夹中文件的递归函数 它已经过测试并且可以正常工作,但是您可能需要对自己的 forkflow 进行一些调整。而且不是最优化的,但是读起来很简单

      Sub test()
        aFiles = F_ListFilesInDirAndSubDir("C:\foo\folder")
        'then, add some code to parse the array:
        For i = 0 to UBound(aFiles)
            'Move or not to move, that is what your code should tell
        Next
      End Sub
      
      Public Function F_ListFilesInDirAndSubDir(ByVal sDir)
          '===============================================================================
          'Get the list of files in a directory and in all its sub directories With the full path
          '===============================================================================
          Dim sChild      As String
          Dim aFolders    As Variant
          Dim aFiles      As Variant
          Dim aChildFiles As Variant
          Dim i           As Long
          Dim j           As Long
          F_ListFilesInDirAndSubDir = aFiles
          Set fs = CreateObject("Scripting.FileSystemObject")
          If Not fs.FolderExists(sDir) Then Exit Function
      
          'Get the files in the directory
          aFiles = F_ListFilesInDir(sDir)
          'Add the fullpath
          For i = 0 To UBound(aFiles)
              If aFiles(i) <> "" Then
                  aFiles(i) = sDir & "\" & CStr(aFiles(i))
              End If
          Next
      
          'get the folders
          aFolders = F_ListFoldersInDir(sDir)
      
          'for each folders, push the files in the file list
          For i = 0 To UBound(aFolders)
              If aFolders(i) <> "" Then
                  sChild = sDir & "\" & CStr(aFolders(i))
                  'Recursive call on each folders
                  aChildFiles = F_ListFilesInDirAndSubDir(sChild)
                  'Push new items
                  For j = 0 To UBound(aChildFiles)
                      If aChildFiles(j) <> "" Then
                          ReDim Preserve aFiles(UBound(aFiles) + 1)
                          aFiles(UBound(aFiles)) = aChildFiles(j)
                      End If
                  Next
              End If
          Next
      
          F_ListFilesInDirAndSubDir = aFiles
      End Function
      
      Public Function F_ListFilesInDir(ByVal sDir)
          '===============================================================================
          'Get the list of files in a directory
          '===============================================================================
          Dim aList     As Variant
          Dim i         As Long
          Dim iChild    As Long
          Dim oFile
          Dim oFolder
          Dim oChildren
          ReDim aList(0)
          F_ListFilesInDir = aList
      
          Set fs = CreateObject("Scripting.FileSystemObject")
      
          If Not fs.FolderExists(sDir) Then Exit Function
      
          Set oFolder = fs.GetFolder(sDir)
          Set oChildren = oFolder.Files
      
          iChild = CDbl(oChildren.Count) - 1
          If iChild = -1 Then Exit Function
      
          ReDim aList(iChild)
          i = 0
          For Each oFile In oChildren
              aList(i) = oFile.Name
              i = i + 1
          Next
      
          F_ListFilesInDir = aList
      End Function
      
      Public Function F_ListFoldersInDir(ByVal sDir As String) As Variant
          '===============================================================================
          'Get the list of folders in a directory
          '===============================================================================
          Dim aList     As Variant
          Dim i         As Long
          Dim oDir
          Dim oFolder
          Dim oChildren
          ReDim aList(0)
      
          F_ListFoldersInDir = aList
      
          Set fs = CreateObject("Scripting.FileSystemObject")
          If Not fs.FolderExists(sDir) Then Exit Function
      
          Set oFolder = fs.GetFolder(sDir)
          Set oChildren = oFolder.SubFolders
      
          If oChildren.Count = 0 Then Exit Function
      
          ReDim aList(oChildren.Count - 1)
          i = 0
          For Each oDir In oChildren
              aList(i) = oDir.Name
              i = i + 1
          Next
      
          F_ListFoldersInDir = aList
      End Function
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-05
        • 2020-06-06
        • 2011-02-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多