我有一个用于将文件从源目录移动到目标目录的vbscript。目前脚本的工作方式是我有一个读入的映射文件(将id映射到文件夹类型)。移动的每个文件都以id开头,目标将基于id映射到的内容。我读入映射文件并为每个要移动的文件构建目标路径。这一切都按预期工作,问题是当我尝试移动目标目录中已存在的文件时,文件不会从源目录移动。基本上我希望它覆盖目标目录中的文件(如果它已经存在)。 目前,我的主要命令是:
fso.MoveFile ObjFile.Path, archiveTo & "\" & yearValue & "\" & monthValue & "\" & ObjFile.Name
有没有办法将此默认设置为始终覆盖destionation目录中的文件(如果已存在)?
答案 0 :(得分:28)
不幸的是,VBScript MoveFile
方法仅在目标文件不存在时才有效。它存在时不能覆盖这样的文件,只是抛出错误。
所以唯一的选择是使用CopyFile(它有覆盖选项)然后使用DeleteFile:
fso.CopyFile ObjFile.Path, archiveTo & "\" & yearValue & "\" & monthValue & "\" & ObjFile.Name, True
fso.DeleteFile ObjFile.Path
答案 1 :(得分:0)
就像前面提到的,MoveFile无法覆盖现有文件。 但是您可以创建自己的功能:
Function MoveFile(source, target)
Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile source, target, True
fso.DeleteFile source
End Function
然后像这样调用它:
MoveFile ObjFile.Path, archiveTo & "\" & yearValue & "\" & monthValue & "\" & ObjFile.Name
答案 2 :(得分:0)
上面的示例看起来不错,但是存在源路径和目标路径可能相同的风险。然后,文件将覆盖自身,并且似乎没有实际复制任何内容。因此,如果在此之后删除源文件,则该文件可能会丢失!因此,我使用的是下面的函数(我认为它更安全):
Public Function GrMoveFile(ByVal sMoveFrom As String, ByVal sMoveTo As String, Optional ByVal fOverride As Boolean = False) As Variant
' This function allows moving file between different drives or servers with possible overriding
' author: Tomasz Kubiak
' t.kubiak@engineer.com
'
' RETURNS:
' - true (if moving successfull)
' - error description (otherwise)
' ARGUMENTS:
' - sMoveFrom - source file path
' - sMoveTo - destination file path
' - fOverride - allow for overriding (false by default)
Dim FSO As New Scripting.FileSystemObject ' File system object - requires reference to Microsoft Scripting Library (Tools -> References)
Dim OrigFileAttr As VbFileAttribute ' Holds attribute of the destination file
On Error GoTo EH
' if overriding is allowed:
If fOverride Then
' It's necessary to prevent the destination file from deleting,
' in case of the source path and destination path points to the same file
' (it's possible e.g. when the network location is mapped as a drive).
' So the solution is to lock the file by setting fileattribute to ReadOnly
' Before locking file let's remember the original state of the destination file
OrigFileAttr = GetAttr(sMoveFrom)
' Unlock file before copy
SetAttr sMoveFrom, vbNormal
' Original FSO MoveFile method does not allow overriding, so we copy the file at first
FSO.CopyFile source:=sMoveFrom, destination:=sMoveTo, overwritefiles:=True
' Set destination file attribute to read-only to prevent deletion
SetAttr sMoveTo, vbReadOnly
On Error Resume Next
' Theoretically the condition below should not be required, because FSO.delete method with
' attribut "force" set to false shouldn't allow for deleting "Read-only files".
' But in practice, when you have a file located on the server location, it appeared to not
' work properly and delete also RO-files, so i've introduced that condition
If GetAttr(sMoveFrom) <> vbReadOnly Then
' Try to delete source file
FSO.DeleteFile sMoveFrom, False
End If
'restore previous file attribute
SetAttr sMoveTo, OrigFileAttr
On Error GoTo EH
' if overriding is NOT allowed:
Else
'move using regular move method (does not allow override)
FSO.MoveFile source:=sMoveFrom, destination:=sMoveTo
End If
'pReleaseFolder
' Moving succesfull, let function return true
GrMoveFile = True
Exit Function
'Error handler
EH:
'pReleaseFolder
' An error occured, return error description
GrMoveFile = Err.Description
End Function