VBS MoveFile问题

时间:2014-08-08 10:42:20

标签: file-io vbscript

我确实编写了第一个if语句,它在启动时运行良好,而我的文件大小只有kbs。

当我的文件大小达到mbs时,它开始给我带来问题,比如它没有从.CSV.tmp再次将文件重命名为.CSV因此我决定在之前和之后添加文件大小(第二个IF语句),但它开始了向我展示2个调试msgBox“在B请求中输入文件:”然后“fname”。之后它失败了,不给予和错误,但也不做这项工作。

你发现它有什么问题吗?

Option Explicit
Dim FSO, FLD, FIL, GetFileSize1, GetFileSize2, f, fname
Dim strFolder,strFileName

strFolder = "\Sieb\Request"
Set FSO = CreateObject("Scripting.FileSystemObject")
set FLD = FSO.GetFolder(strFolder)

For Each Fil In FLD.Files
  strFileName=Lcase(Fil.Name)

  If instr (1,strFileName,"_a_request_")>0 then
    if (FSO.FileExists(".\Sieb_Process_Files\a\Request\"+Fil.Name)) then
    else
      FSO.MoveFile ".\Request\"+Fil.Name,".\Sieb_Process_Files\a\Request\" + Fil.Name +".tmp"
      FSO.MoveFile ".\Sieb_Process_Files\a\Request\" + Fil.Name +".tmp", ".\Sieb_Process_Files\a\Request\" + Fil.Name 
    end if
  End if

  If instr (1,strFileName,"_b_request_")>0 then
    if (FSO.FileExists(".\Sieb_Process_Files\b\Request\"+Fil.Name)) then
    else
      MsgBox "Entry in B Request with File : " + Fil.Name
      set fname = ".\Sieb_Process_Files\b\Request\" + Fil.Name
      MsgBox fname
      set f = FSO.GetFile(fname) 
      GetFileSize1 = f.size 
      MsgBox "Orignal File Size" + GetFileSize1
      FSO.MoveFile ".\Request\"+Fil.Name,".\Sieb_Process_Files\b\Request\" + Fil.Name +".tmp"
      set f = FSO.GetFile(".\Sieb_Process_Files\b\Request\" + Fil.Name +".tmp") 
      GetFileSize2 = f.size 
      MsgBox "Copied File Size" + GetFileSize2
      MsgBox "File Moved with tmp name"
      Do Until GetFileSize1=GetFileSize2
        FSO.MoveFile ".\Sieb_Process_Files\b\Request\" + Fil.Name +".tmp" ,".\Sieb_Process_Files\b\Request\" + Fil.Name 
        MsgBox "File renamed to orignal name exiting now"
        Exit Do
      Loop
    end if
  End if
Next
Set Fil = nothing
set FSO = nothing

1 个答案:

答案 0 :(得分:1)

显然,您的第一个If条件成功移动了目标中不存在的文件(文件大小与其无关)显然不可能。

if (FSO.FileExists(".\Sieb_Process_Files\a\Request\"+Fil.Name)) then
else
  FSO.MoveFile ".\Request\"+Fil.Name,".\Sieb_Process_Files\a\Request\" + Fil.Name +".tmp"
  FSO.MoveFile ".\Sieb_Process_Files\a\Request\" + Fil.Name +".tmp", ".\Sieb_Process_Files\a\Request\" + Fil.Name 
end if

将文件移动到其他位置/名称后,您的变量Fil引用的文件不再存在,因此第二个MoveFile(或者更确切地说,尝试访问该属性{ {1}})会引发“找不到文件”错误。如果您没有收到错误,那么代码中的Fil.Name就是您未显示的内容。

另外,为什么要将文件移动到临时名称,然后又回到同一目录中的原始名称?这只有在将文件移动到不同卷上的热文件夹时才有意义,这在这里似乎并非如此。

这样的事情应该是你所需要的:

On Error Resume Next

Option Explicit Dim fso, sourceFolder, targetFolder, f, target sourceFolder = "\Sieb\Request" targetFolder = ".\Sieb_Process_Files\a\Request" Set fso = CreateObject("Scripting.FileSystemObject") For Each f In fso.GetFolder(sourceFolder).Files target = fso.BuildPath(targetFolder, f.Name) If InStr(1, f.Name, "_a_request_", vbTextCompare) > 0 Then If Not fso.FileExists(target) Then f.Move target End If End If Next 使vbTextCompare比较不区分大小写,因此您不需要小写文件名。