将某些文件模式复制到另一个文件夹

时间:2011-07-25 20:18:42

标签: windows vbscript copy

下午好,我希望有一个脚本可以查找名称为LCP的所有文件 - ???和/或FSA - ???在c:\ streetweeper中将它们复制到D:\ java \ temp \ sz-files。 该脚本将在启动时运行。

我发现了一个功能非常相似的vbscript,它使用文本文件来读取需要复制的文件。任何人都可以帮助我将此脚本转换为如上所述的功能吗?

谢谢你的时间,脚本如下:

Option Explicit

'The source path for the copy operation.
Const strSourceFolder = "c:\streetweeper"

'The target path for the copy operation.
Const strTargetFolder = "D:\java\temp\sz-files"

'The list of files to copy. Should be a text file with one file on each row. No paths -    just file name.
Const strFileList = "C:\filelist.txt"

'Should files be overwriten if they already exist? TRUE or FALSE.
Const blnOverwrite = FALSE

Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")

Const ForReading = 1
Dim objFileList
Set objFileList = objFSO.OpenTextFile(strFileList, ForReading, False)

Dim strFileToCopy, strSourceFilePath, strTargetFilePath
On Error Resume Next
Do Until objFileList.AtEndOfStream
'Read next line from file list and build filepaths
strFileToCopy = objFileList.Readline
strSourceFilePath = objFSO.BuildPath(strSourceFolder, strFileToCopy)
strTargetFilePath = objFSO.BuildPath(strTargetFolder, strFileToCopy)

'Copy file to specified target folder.
Err.Clear
objFSO.CopyFile strSourceFilePath, strTargetFilePath, blnOverwrite
If Err.Number = 0 Then
    'File copied successfully

Else
    'Error copying file
    Wscript.Echo "Error " & Err.Number & " (" & Err.Description & "). Copying " & strFileToCopy
End If
Loop

2 个答案:

答案 0 :(得分:1)

copystuff.cmd

中的

REM The following statement will have no effect if the directory does exist.
mkdir D:\java\temp\sz-files

XCOPY /Y /E c:\streetweeper\LCP-*.* D:\java\temp\sz-files

IF ERRORLEVEL 0 GOTO COPYNEXT
GOTO END

:COPYNEXT
XCOPY /Y /E c:\streetweeper\FSA-*.* D:\java\temp\sz-files

IF ERRORLEVEL 0 GOTO DELETEFILES
GOTO End

:DELETEFILES
DEL /Q LCP-*.*
DEL /Q FSA-*.*

:End

OR

REM The following statement will have no effect if the directory does exist.
mkdir D:\java\temp\sz-files

MOVE /Y C:\StreetSweeper\LCP-*.* D:\Java\Temp\sz-files
MOVE /Y C:\StreetSweeper\FSA-*.* D:\Java\Temp\sz-files

在开始菜单的启动文件夹中填充,你很高兴!

答案 1 :(得分:0)

这是一个使用正则表达式复制文件模式的VBScript文件。目录功能由Christian d'Heureuse

编写

我没有详细解析参数。因此,如果源和destiation模式包含*

,脚本将只起作用

电话应该如下:

cscript myscript.vbs "C:\temp\filesToCopy_*.txt" "D:\temp\newName_*.txd"

'  ___      _   _                ___               
' | _ \__ _| |_| |_ ___ _ _ _ _ / __|___ _ __ _  _ 
' |  _/ _` |  _|  _/ -_) '_| ' \ (__/ _ \ '_ \ || |
' |_| \__,_|\__|\__\___|_| |_||_\___\___/ .__/\_, |
'                                       |_|   |__/ 
' Copy files using patterns
' any given String is split into three parts {part1}{*}{part3}
' the replacement String is used in the same pattern to replace the three parts 
' (c) m.wallner-novak
'
' vbCopyFile
' Usage cscript vbCopyFile.vbs {Source} {Destination}
'

Option Explicit

Main

'''
' Main Procedure
'
Sub Main

    dim SourcePattern 
    dim DestPattern 
    dim sFile

    if Wscript.Arguments.count = 2 then

        SourcePattern = WScript.arguments(0)
        DestPattern = WScript.arguments(1)

        Dim a
        a = ListDir(SourcePattern)

        If UBound(a) = -1 then
            WScript.Echo "No files found with specified source path:"
            WScript.Echo SourcePattern
            Exit Sub
        End If

        Dim FileName
        dim regEx
        Set regEx = new regexp  'Create the RegExp object
        dim sPattern

        sPattern = SourcePattern
        sPattern = replace(sPattern,"\","\\")
        sPattern = replace(sPattern,".","\.")
        sPattern = replace(sPattern,"*",")(.*)(")
        sPattern = "(" & sPattern & ")"

        dim part1
        dim part3
        dim pos1

        pos1 = instr(DestPattern,"*")

        if pos1>0 then
            part1 = left(DestPattern,pos1-1)
            part3 = mid(DestPattern,pos1+1,999)
        end if

        regEx.Pattern = sPattern
        regEx.IgnoreCase = True

        Dim Fso
        Set Fso = WScript.CreateObject("Scripting.FileSystemObject")        

        on error resume next
        For Each FileName In a
            WScript.Echo "copying """ & FileName & """ to """ & regEx.Replace(FileName, part1 & "$2" & part3) & """"
            Fso.CopyFile FileName, regEx.Replace(FileName, part1 & "$2" & part3)

            if err.number <> 0 then
                Wscript.echo "ERROR #" & err.number & vbcrlf & err.Description
                exit sub
            end if
        Next

    else
        WScript.echo "Wrong number of arguments"
        WScript.echo Wscript.ScriptName & " SourcePattern DestinationPattern"
        WScript.echo "SourcePattern and DestinationPattern are {part1}{*}{part3}"
        WScript.echo "Example: Hello*.exe Hello_World*_prefix.exe"
        WScript.echo " will copy Hello123.exe to Hello_World123_prefix.exe"
    end if

end sub

'''
' Test program for the ListDir function.
' Lists file names using wildcards.
'
' Author:  Christian d'Heureuse (www.source-code.biz)
' License: GNU/LGPL (http://www.gnu.org/licenses/lgpl.html)
'
' Changes:
' 2006-01-19 Extended to handle the special case of filter masks
'            ending with a ".". Thanks to Dave Casey for the hint.
Sub Main2
   Dim Path
   Select Case WScript.Arguments.Count
      Case 0: Path = "*.*"             ' list current directory
      Case 1: Path = WScript.Arguments(0)
      Case Else: WScript.Echo "Invalid number of arguments.": Exit Sub
      End Select
   Dim a: a = ListDir(Path)
   If UBound(a) = -1 then
      WScript.Echo "No files found."
      Exit Sub
      End If
   Dim FileName
   For Each FileName In a
      WScript.Echo FileName
      Next
   End Sub

' Returns an array with the file names that match Path.
' The Path string may contain the wildcard characters "*"
' and "?" in the file name component. The same rules apply
' as with the MSDOS DIR command.
' If Path is a directory, the contents of this directory is listed.
' If Path is empty, the current directory is listed.
' Author: Christian d'Heureuse (www.source-code.biz)
Public Function ListDir (ByVal Path)
   Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
   If Path = "" then Path = "*.*"
   Dim Parent, Filter
   if fso.FolderExists(Path) then      ' Path is a directory
      Parent = Path
      Filter = "*"
     Else
      Parent = fso.GetParentFolderName(Path)
      If Parent = "" Then If Right(Path,1) = ":" Then Parent = Path: Else Parent = "."
      Filter = fso.GetFileName(Path)
      If Filter = "" Then Filter = "*"
      End If
   ReDim a(10)
   Dim n: n = 0
   Dim Folder: Set Folder = fso.GetFolder(Parent)
   Dim Files: Set Files = Folder.Files
   Dim File
   For Each File In Files
      If CompareFileName(File.Name,Filter) Then
         If n > UBound(a) Then ReDim Preserve a(n*2)
         a(n) = File.Path
         n = n + 1
         End If
      Next
   ReDim Preserve a(n-1)
   ListDir = a
 End Function

Private Function CompareFileName (ByVal Name, ByVal Filter) ' (recursive)
   CompareFileName = False
   Dim np, fp: np = 1: fp = 1
   Do
      If fp > Len(Filter) Then CompareFileName = np > len(name): Exit Function
      If Mid(Filter,fp) = ".*" Then    ' special case: ".*" at end of filter
         If np > Len(Name) Then CompareFileName = True: Exit Function
         End If
      If Mid(Filter,fp) = "." Then     ' special case: "." at end of filter
         CompareFileName = np > Len(Name): Exit Function
         End If
      Dim fc: fc = Mid(Filter,fp,1): fp = fp + 1
      Select Case fc
         Case "*"
            CompareFileName = CompareFileName2(name,np,filter,fp)
            Exit Function
         Case "?"
            If np <= Len(Name) And Mid(Name,np,1) <> "." Then np = np + 1
         Case Else
            If np > Len(Name) Then Exit Function
            Dim nc: nc = Mid(Name,np,1): np = np + 1
            If Strcomp(fc,nc,vbTextCompare)<>0 Then Exit Function
         End Select
      Loop
End Function

Private Function CompareFileName2 (ByVal Name, ByVal np0, ByVal Filter, ByVal fp0)
   Dim fp: fp = fp0
   Dim fc2
   Do                                  ' skip over "*" and "?" characters in filter
      If fp > Len(Filter) Then CompareFileName2 = True: Exit Function
      fc2 = Mid(Filter,fp,1): fp = fp + 1
      If fc2 <> "*" And fc2 <> "?" Then Exit Do
      Loop
   If fc2 = "." Then
      If Mid(Filter,fp) = "*" Then     ' special case: ".*" at end of filter
         CompareFileName2 = True: Exit Function
         End If
      If fp > Len(Filter) Then         ' special case: "." at end of filter
         CompareFileName2 = InStr(np0,Name,".") = 0: Exit Function
         End If
      End If
   Dim np
   For np = np0 To Len(Name)
      Dim nc: nc = Mid(Name,np,1)
      If StrComp(fc2,nc,vbTextCompare)=0 Then
         If CompareFileName(Mid(Name,np+1),Mid(Filter,fp)) Then
            CompareFileName2 = True: Exit Function
            End If
         End If
      Next
   CompareFileName2 = False
 End Function