运行两个vbs脚本的批处理文件用于备份

时间:2013-07-23 17:34:32

标签: batch-file vbscript

我有一个运行旧FoxPro程序的系统,它生成8个字符长的DBF文件。我们每天都会对程序文件夹进行备份,但是在下午5点,程序生成了很多这样的垃圾dbf,这是一个令人讨厌的问题。我只想在备份脚本中设置del * .dbf,但是有一些dbf在其名称中包含运行程序所需的字母。

文件位于F:\ Clean This \

任何带数字标题的.dbf文件都需要删除

任何按字母顺序标题的.dbf文件都应该单独存放

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "F:\Clean This\"
Set objFolder = objFSO.GetFolder(objStartFolder)
Set colFiles = objFolder.Files
collide = "ABCEDFGHIJKLMNOPQRSTUVWXYZ"

For Each objFile in colFiles
    If UCase(objFSO.GetExtensionName(objFile.name)) = "DBF" Then
        num = 1
        For num = 1 to 26 'find files with names start with # 0-9
            If Left(objFile.Name,1) = Left(collide,num) Then
                Wscript.Echo "Save " & objFile.Name
            Else If int(Left(objFile.Name,1)) > 0 Then
                Wscript.Echo "Delete!"
            End IF
            End If
        Next
    End If
Next

正如你可以告诉If语句可以做得更好,我不确定如何更好地解决它。两个Wscript.Echo命令只是占位符,因为如果还有什么我找不到合适的删除函数,它可以在dos环境中工作(我已经尝试过kill,no)。

非常感谢建议和改进!

2 个答案:

答案 0 :(得分:1)

使用IsNumeric()检查仅由数字组成的文件名:

>> For Each sN In Split("abc 123 1O1 101")
>>     If IsNumeric(sN) Then
>>        WScript.Echo "delete", sN
>>     Else
>>        WScript.Echo "keep", sN
>>     End If
>> Next
>>
keep abc
delete 123
keep 1O1
delete 101

您的检查失败,因为您使用Left(),您应该使用Mid():

>> collide = "ABCEDFGHIJKLMNOPQRSTUVWXYZ"
>> num = 5
>> WScript.Echo Left(collide,num)
>> WScript.Echo Mid(collide,num,1)
>>
ABCED
D

即便如此,Left(objFile.Name,1)也只会查看文件名的第一个字符。

更新(wrt评论):

将IsNumeric()应用于基本名称:

  Dim oFile
  For Each oFile In goFS.GetFolder("..\testdata\17817161").Files
      WScript.Stdout.Write oFile.Name
      If "dbf" = LCase(goFS.GetExtensionName(oFile.Name)) Then
         If IsNumeric(goFS.GetBaseName(oFile.Name)) Then
            WScript.Stdout.WriteLine " delete"
         Else
            WScript.Stdout.WriteLine " keep"
         End If
      Else
         WScript.Stdout.WriteLine " ignore"
      End If
  Next

输出:

123.dbf delete
123.txt ignore
abc.dbf keep

答案 1 :(得分:0)

我终于让它运转了,这就是最终结果。它运行得非常好,高层建筑和其他设备相当令人印象深刻,它比我们备份的程序的内置实用程序更好。得分!

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "..\System Folder"
Set objFolder = objFSO.GetFolder(objStartFolder)
Set DirFiles = objFolder.Files
Dim oFile
For Each objFile in DirFiles
If "dbf" = LCase(objFSO.GetExtensionName(objFile.Name)) Then
    If IsNumeric(objFSO.GetBaseName(objFile.Name)) Then
        objFSO.DeleteFile(objFile)
    End If
End If    
Next